ユーザーが入力したデータが処理されずに SQL クエリ ステートメントに挿入された場合、次の例のように、アプリケーションは SQL インジェクション攻撃を受ける可能性があります。 リーリー
ユーザーの入力は次のようになります:リーリー
その後、SQL クエリは次のようになります:リーリー
SQL インジェクションを防ぐためにはどのような効果的な方法を採用する必要がありますか?ベストアンサーは
1. PDO を使用します: リーリー
2. mysqli を使用します: リーリー
PDO デフォルトで PDO を使用すると、MySQL データベースが実際のプリペアドステートメントを実行できないことに注意してください (以下を参照)。この問題を解決するには、準備されたステートメントの PDO エミュレーションを無効にする必要があります。 PDO を正しく使用してデータベース接続を作成する例は次のとおりです:リーリー
上記の例では、エラー報告モード (ATTR_ERRMODE) は必須ではありませんが、追加することをお勧めします。このようにして、致命的なエラー (Fatal Error) が発生した場合でも、スクリプトの実行は停止されませんが、プログラマは PDOExceptions をキャッチしてエラーを適切に処理できるようになります。 ただし、最初の setAttribute() 呼び出しが必要です。これにより、PDO によるプリペアド ステートメントのシミュレーションが無効になり、実際のプリペアド ステートメントが使用されます。つまり、MySQL がプリペアド ステートメントを実行します。これにより、ステートメントとパラメータが MySQL に送信される前に PHP によって処理されていないことが保証され、攻撃者による悪意のある SQL の挿入が防止されます。理由を理解するには、このブログ投稿を参照してください:PDO アンチインジェクション原理の分析と PDO 使用時の注意点。 PHP の古いバージョン (5.3.6 未満) では、PDO コンストラクターの DSN を介して文字セットを設定できないことに注意してください。次を参照してください: charset パラメータをサイレントに無視しました。
分析リーリー
翻訳リンク:http://blog.jobbole.com/67875/