Bobby Tables:SQLインジェクションを防止するためのガイド
なぜBobbyの学校はレコードを失ったのですか?
学校は、学生の名前をStudentsというテーブルに保存しているようです。 新しい学生が到着すると、学校はこのテーブルに彼/彼女の名前を挿入します。 挿入を行うコードは次のようになります。
最初の行は、SQL INSERTステートメントを含む文字列を作成します。 $studentName
変数の内容は、SQLステートメントに接着されています。, 次の行は、結果のSQL文をデータベースに送信します。 このコードの落とし穴は、外部データ(この場合は$studentName
の内容)がSQLステートメントの一部になることです。
まず、Johnという名前の学生を挿入した場合のSQLステートメントの外観を確認しましょう。
これは、まさに私たちが望むことを行います:それはStudentsテーブルにJohnを挿入します。
ここで、$studentName
をRobert"); DROP TABLE Students;--
に設定して、小さなボビーテーブルを挿入します。, SQLステートメントは次のようになります。
これにより、RobertがStudentsテーブルに挿入されます。 ただし、INSERTステートメントの後には、Studentsテーブル全体を削除するDROP TABLEステートメントが続きます。 痛っ!
ボビーテーブルを回避する方法
ボビーテーブル攻撃を回避する唯一の方法があります
- 外部データを含むSQLステートメントを作成しないでください。
- パラメーター化されたSQL呼び出しを使用します。
それはそれです。 無効な文字をエスケープしようとしない。 それを自分でやろうとしないでください。 パラメータ化されたステートメン いつも、いつも。,
ストリップは一つのことが決定的に間違っています。 答えは、”データベース入力をサニタイズする”ことではありません。 それはエラーになりやすいです。