18

phpでmysqlを使用するためにmysqliとpdoを使用することに関するいくつかの質問を読んでいます。

mysqliやPDOなどの質問を見たことがあります-長所と短所は何ですか?またはmysqlからmysqliまたはpdoに移行しますか?、どちらもmysqlivpdoのみを扱います。私はこれらの2つの方法のどちらが優れているかについてはあまり興味がありません。

なぜmysql_関数を避けるべきなのか疑問に思いました。もちろん、これらはPHPのドキュメントhttp://php.net/manual/en/faq.databases.php#faq.databases.mysql.deprecatedに従って非推奨化されている途中であり、スレッドPHPPDOとMySQLi はPDOとMySQLiはより強力で、スレッドMySQL、MySQLi、PDOの違いは何ですか?これらの新しい方法がより安全であることを意味します。

全体として、mysql_メソッドの大きな弱点は何であり、それを回避する理由は何であるか疑問に思っています(非推奨であるという理由だけでなく、より具体的に推測します)。影響を受けるスクリプトを更新する予定であり、この古いメソッドが非推奨になった理由に興味を持ちました。

ありがとう!

4

3 に答える 3

23

関数の設計は、mysql_query注入するデータのすべてのビットを慎重にエスケープする必要があるようになっています。1つでも見逃すと、自動SQL脆弱性エクスプロイトツールによってアプリケーション全体が破壊される可能性があります。

mysqliとPDOはどちらも、クエリがSQLインジェクションのバグから安全であることを保証するために必要なプレースホルダーをサポートしています。すべてを呼び出すmysql_real_escape_stringのは面倒なだけでなく、エラーが発生しやすく、そこで問題が発生します。

これらのmysql関数は、PHPのごく初期の製品でありmysqli、オプションまたは設計によるPDOの両方で提供される新しいオブジェクト指向機能よりも大幅に制限されています。

これら2つの新しいインターフェイスのいずれかを使用する理由はいくつかありますが、最も重要なのは、mysql_query関数が危険すぎて本番コードで使用できないことです。それを使用すると、いくつかの非常に深刻な問題から常に1つの間違いになります。

パスワードとクレジットカード番号でいっぱいのデータベースのリッピングが表示され続けるのには理由があります。明らかなSQLインジェクションポイントがあると、サイトを完全に引き継ぐのがほとんど簡単になります。

于 2012-08-23T17:47:27.193 に答える
8

MySSQL API @ PHP.netの選択から:

// mysqli
$mysqli = new mysqli("example.com", "user", "password", "database");
$result = $mysqli->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $result->fetch_assoc();
echo htmlentities($row['_message']);

// PDO
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
$statement = $pdo->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['_message']);

// mysql
$c = mysql_connect("example.com", "user", "password");
mysql_select_db("database");
$result = mysql_query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = mysql_fetch_assoc($result);
echo htmlentities($row['_message']);

mysqliやPDOのようにオブジェクトを作成することは、最新のソフトウェアを作成するための推奨される方法です。mysqlライブラリはPHPバージョン2.0用にリリースされており、それ以降、大幅な書き換えは行われていません。PHP 2.0は1997年にリリースされました。これは、PHP2.0を使用しない理由を説明するのに十分なはずです。

于 2012-08-23T17:52:20.687 に答える
2

たとえば、入力を手動で適切にサニタイズしないと、mysql関数はSQLインジェクションを非常に起こしやすくなります。mysqliとpdoには、このリスクを回避するためのパラメーター化されたsqlステートメントオプションがあります。私の意見では、それらは一般的に、より良いコーディングスタイルを持っています。

于 2012-08-23T17:42:21.930 に答える