web-dev-qa-db-ja.com

SQLインジェクションの脆弱性の可能性?

私は開発者であり、ゲームサーバーとインターフェイスしてプレーヤーの統計情報を更新するスクリプトを作成しています。 POSTマルチパートフォームデータを含むリクエストを送信していて、最後の境界で誤って境界が間違っていました。

Content-Type: multipart/form-data; boundary=--------484554302

しかし、1文字が欠落していた----------48455430--サーバーからこの応答をトリガーしました:

MySQL error 1064 (You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\r\n----------48455430-- = '' WHERE id = '463413'' at line 1)

SQLについてはあまり知りませんが、これは潜在的な脆弱性のようです。何かアドバイス?

4

適切なエンコードや準備されたステートメントを使用せずに、前のデータセットにあるはずのものをMySQLに渡そうとしているようです。その結果、MySQLは境界をSQLコードとして解釈し、有効なSQLではないというエラーをスローします。

少なくとも、SQLクエリに含まれるすべてのデータをエンコードする必要があります。さらに良いのは、データを特定のタイプに強制することです。整数が必要な場合は、整数のみが通過できるようにし、データベースに到達する前に整数でないものはすべて拒否するようにしてください。さらに、それを行い、準備されたステートメントを使用します。

準備されたステートメントは、実行可能なSQLとSQL内で使用しているデータの分離を強制するため、予期しないデータが通過しても、データベースはそれをSQLステートメントの一部として扱わず、代わりにデータとして使用しようとします。これらは、最も一般的なデータベースで最も一般的に使用されるWeb言語で使用できます。それらは完璧ではありません( SQLインジェクションに対して100%安全な準備済みステートメントを参照してください? を参照)が、生データを含めるよりもはるかに優れています。

4
Matthew