PHPのmysqliクラスは、SQLインジェクションから100%を保護しますか?
-
03-07-2019 - |
質問
mysqliに関する多くの記事と質問を見てきましたが、それらはすべて、SQLインジェクションから保護すると主張しています。しかし、それは馬鹿な証拠ですか、それとも回避する方法がまだありますか。クロスサイトスクリプティングやフィッシング攻撃には興味がありません。SQLインジェクションのみです。
最初に言っておくべきことは、準備されたステートメントを使用しているということです。それがmysqliの意味です。文字列の連結なしで準備されたステートメントを使用する場合、それは絶対に安全ですか?
解決
しかし、それはだましの証拠なのか、それを回避する方法がまだあります。
いいえ、あなたは何をしているのかを知る必要があります。バインドされたパラメーター(MySqliに付属の機能)を使用する場合、この攻撃ベクトルからのインジェクションタイプの攻撃から完全に安全です 。これは、プログラマーが文字列を直接埋め込むことを妨げないため、インジェクション攻撃が可能になります。意図したとおりに機能を使用する必要があります。
再:編集
最初に言っておくべきことは、準備されたステートメントを使用しているということです。それがmysqliの意味です。文字列の連結なしで準備されたステートメントを使用する場合、それは絶対に安全ですか?
フールプルーフは今でも危険な言葉です。ただし、準備済みステートメントを介してバインドされた変数に対するインジェクション攻撃からは安全です。これは、バインドされたパラメーターがSQLクエリとは別に送信されるためです。 「従来の」埋め込み文字列アプローチでは、データベースサーバーが入力を解析する必要があり、その中に多くのエッジケースがあります(Charsetsなど)。データとクエリが別々に送信されると、実際の解析は行われません(少なくとも変数データの解析は行われません)。
他のヒント
これは、古いmysqlモジュールよりもSQLインジェクションから保護されず、mysql_real_escape_stringを呼び出す代わりに準備されたステートメントを使用できるようになった開発者にとって簡単になります。