ある種のカスタマイズされたものを評価しようとしていますCMS
。デボロッパーがSQL
攻撃に対して使用する保護は次のとおりです。
str_replace("'", "\'", $_POST[$variable]);
これで十分ですか、それともこれを利用してSQL
コードを挿入する方法がありますか?
PS:私は標準的な方法が使用されていることを知ってmysql_real_escape_string()
いますが、コードの一般的な品質についてのアイデアを得ようとしています。
ある種のカスタマイズされたものを評価しようとしていますCMS
。デボロッパーがSQL
攻撃に対して使用する保護は次のとおりです。
str_replace("'", "\'", $_POST[$variable]);
これで十分ですか、それともこれを利用してSQL
コードを挿入する方法がありますか?
PS:私は標準的な方法が使用されていることを知ってmysql_real_escape_string()
いますが、コードの一般的な品質についてのアイデアを得ようとしています。
いいえ。UTF8文字を入力すると、コードが文字化けするか、エスケープされます。
mysqli / PDOを使用するか、必要に応じてmysql_real_escape_stringを使用します。
str_replace("'", "\'", $_POST[$variable]);
はい、これは脆弱です。
自明なことに、バックスラッシュはエスケープされないため、バックスラッシュを使用して文字列リテラルから抜け出し、引用符をマスクすることができます:hello\' OR 1 --
-> 'hello\\' OR 1 --'
。
ヌルもエスケープされず、問題が発生する可能性があります。
また、東アジアの文字セットが使用されている場合は、マルチバイトシーケンスを使用して引用符をマスクできます。'
(UTF-8は末尾のバイトとして許可されていないため、これはUTF-8には当てはまらないことに注意してください。)
また、このエスケープ形式はMySQLにのみ適しています。他のデータベースが使用されている場合、またはANSI準拠の文字列リテラルオプションがMySQLで使用されている場合、標準のエスケープはバックスラッシュではなく引用符を2倍にすることであるため、効果がありません。
コードは役に立たない。せいぜい、SQLインジェクションが存在することを誰かが認識していることを示していますが、実際の問題を実際に理解しているわけではありません。
SQLインジェクションにはさまざまな形式があります。
数値フィールド(PIN番号を考えてください)に対してwhere句を実行するクエリがあった場合、それは簡単に挿入できます。
ユーザーが入力した番号に一致するものを探すのに無害なもの:
SELECT * FROM table
WHERE ID = 1
常に一致するものに変わる可能性があります
SELECT * FROM table
WHERE ID = 1 OR 1 = 1
ベンダー固有のエスケープ関数またはプリペアドステートメントを使用するのが最善の方法です。