2

私はここ数週間PHPとMySQLを学んでいますが、プリペアドステートメントとPDO/mysqliについて聞いています。私はいくつかの読書をしました、そして人々はそのようなものを言っています:

$getFromDatabase = mysql_query("SELECT * FROM table WHERE userid='$id'");
while($row = mysql_fetch_assoc($getFromDatabase)){
    stuff();
}

...もう動作しません。私は自分のコードでそのようなものをかなり頻繁に使用しています。私はまた、準備されたステートメントがどのように注射に対するより良い保護であるかについてたくさん読んでいます。私はそれがどのように優れているかを完全に理解していますが、mysql_real_escape_string()から切り替える価値があるほど優れていますか?MysqliまたはPDOに切り替える必要がありますか?プリペアドステートメントができなかった場合、どのような状況でmysql_real_escape_string()をバイパスできますか?

4

1 に答える 1

7

mysql_queryソフトウェアの観点からは、古代のアーティファクトであるため、これが必要です。これは、MySQLデータベースインターフェイスのモデルTであり、不格好で信頼性が低く、正確に使用しないとまったく危険です。細心の注意を払わないと間違いを犯し、サイトで誰かが自動SQLインジェクションバグ検出ツールを使用していれば、小さな間違いでも気付かれることはありません。

基本的にあなたは借りた時間に住んでいますmysql_query

またはPDOを使用mysqliしていて、プレースホルダーの使用に熱心に取り組んでいる場合、SQLインジェクションのバグのリスクは非常に低くなります。古いコードをこれらの新しいメソッドに変換する方法を理解するのに約30分かかる場合があります。実際には急な学習曲線はなく、その知識は将来多くの問題を回避します。mysqli基本的なプレースホルダーを使用する場合、既存のコードの変換は通常それほど大きな問題ではありません。私はあなたが物事を修正している間にいくつかの深刻なバグを見つけることさえあるに違いない。

利点に関しては、呼び出しを行う必要はなくmysql_real_escape_string、を使用するだけbind_paramで、変数の1つでエスケープを見逃すことを心配する必要はありません。実際には、長期的にははるかに少ない作業です。

さらに、?またはのような名前付きプレースホルダーを使用:idすると、クエリの読み取り、デバッグ、および保守が非常に簡単になります。さらに、同じステートメントを繰り返し使用し、それに異なる値をバインドして、最終的にアプリケーションを高速化することができます。

で安全なコードを書くことは可能ですmysql_queryが、なぜあなたはそうしますか?インターフェイスは非推奨としてリストされています。これは、PHPから完全に削除されるための準備段階です。将来を見据えたアプリケーションが必要な場合は、サポートされているインターフェイスの1つを使用することをお勧めします。

于 2012-08-29T01:35:14.717 に答える