4

これは、PDO 準備済みステートメントを対象としたセキュリティの質問です。PDO を使用すると、SQL インジェクションのリスクは事実上不可能であり、クラスがそのすべてを処理することがわかっています。それらの mysql_* スタックを使用することから、セキュリティの問題を十分に処理していないかのように常に感じています。私は通常、セキュリティに対処するためだけに何百行ものコードを書くことに慣れていましたが、今では文字通りクエリを書いているだけです。

データベース内の文字列の長さ以外に心配しなければならない PDO ステートメントのセキュリティ上の脅威は本当にありますか?

4

2 に答える 2

2

絶対そうです。

実際のところ、ネイティブのプリペアド ステートメントは、教科書の単純なケースにのみ適しています。
複雑なケースが何であれ、「数百行」を書かなければならないことを意味します。そのようなケースの小さなダイジェストをPDO タグ wikiに作成しました。主なデメリットは

  • 識別子のプレースホルダーはありません。古い良い mysql_* コードのように、手動でフォーマットして注入する必要があります。
  • 配列のプレースホルダーはありません。つまり、コードを手動で記述し、後でそれをクエリに挿入する必要があることを意味します。そのため、何らかのトラブルに陥る可能性がまだあります。

したがって、PDO でもより高いレベルの抽象化が必要です。一般的な解決策は、最新のすべてのフレームワークで提供されるある種のクエリ ビルダーを使用することです。

しかし、個人的には、SQL 全体を置き換えるふりをして、明らかに失敗しているように見えて、肥大化しすぎているように見えるクエリ ビルダーが嫌いです。というわけで、純粋なSQLが使えるのになぜPHPで書かれたSQLを使うのか理解できません。この目的のために、ネイティブのプリペアド ステートメントsafeMysqlのすべての欠点を修正するために、抽象化ライブラリを作成しました。必要なものすべてのプレースホルダーがあるため、クエリは PDO よりもはるかに安全になりますが、アプリケーション コードは劇的に短くなります。

safeMysqlを使用すると、実際に「文字通りクエリを書く」ことができます。

$sql  = "SELECT * FROM articles WHERE id IN(?a) ORDER BY ?n LIMIT ?i"
$data = $db->getAll($sql, $ids,$_GET['order'], $limit);

$sql  = "INSERT INTO stats SET pid=?i,ip=inet_aton(?s),?u ON DUPLICATE KEY UPDATE ?u";
$db->query($sql, $pid, $ip, $data, $data);

これらの 2 ライナーを、生の PDO を使用して記述する必要があるコードの量と比較してください。

于 2013-04-13T05:18:12.683 に答える