SQL インジェクション攻撃を防ぎたい場合は、準備済みステートメントを使用してください。あなたが何かをするとき
SELECT * FROM TABLE WHERE id = $_GET['x']
このクエリの問題は、変数が SQL ステートメントの一部と見なされることです。つまり、DBMS はクエリの残りの部分と共に変数を解析/コンパイルして実行します。効果的に、次のようなものを提供できます
$x = "1); DROP TABLE users;"
ステートメントの一部であるため、サーバーはそのコマンドを実行します。
準備されたステートメントを導入すると、変数のスコープはパラメーターのスコープに制限され、エスケープされていなくても、クエリの残りの部分には影響しません。これは、SQL ステートメントがデータベースによって解析/最適化/コンパイルされており、パラメーターをバインドするだけでよいためです。sql ステートメントはテンプレートです。
SELECT * FROM TABLE WHERE id = ?
準備済みステートメントを使用することの追加の利点は、速度です。テンプレートはすでに解析/コンパイルされているため、データベースはそのプロセスを繰り返す必要がないため、再利用できます。パラメーターを置き換えるだけで済みます。
PHP では、PDO と mysqli_* 関数の両方が準備済みステートメントをサポートしています。
mysqli については、http: //php.net/manual/en/mysqli.prepare.php を参照してください
。PDO については、 http: //php.net/manual/en/pdo.prepare.phpを参照してください。
XSS 攻撃に関しては、これでいくつかのアプローチを取ることができます。1 つ目は、ページに印刷するときにユーザー入力を単純にエスケープすることです。次のような非常に危険な文字:
<>"" // and so on
同等の html エンティティに置き換えられます。の場合は<script>
に変換され<script>
ます。
ホワイトリスト アプローチをセットアップして、ユーザー入力に対して X タグのみを許可することもできます。これは、ユーザーが div や p タグなどの特定の html タグにアクセスする必要があるが、スクリプト タグなどにはアクセスできないコンテンツ指向のサイトで特に役立ちます。ホワイトリストにないタグは除外されます。非常に多くの方法があるため、これを完全にカバーすることは非常に困難ですが、それでもセキュリティを強化することができます。詳細については、 http://php.net/manual/en/function.filter-var.phpを参照してください。
3 番目のアプローチは、html タグをカスタム タグに置き換えることです (SO のように)。したがって、単語の前にある星印は、<strong>
html タグなどを表す場合があります。
後者の 2 つを取り上げる場合でも、データをエスケープする必要があることに注意してください。彼らが言うように、猫の皮を剥ぐ方法は常に複数あるため、すべてのユーザー入力データは、フィルター処理されたとしても潜在的に危険であると見なす必要があります。