8

会話を始めるためのいくつかの可能性を次に示します。

  1. 初期化時にすべての入力をエスケープします。
  2. できれば SQL を生成するときに、各値をエスケープします。

最初の解決策は最適ではありません。Web ページに出力するなど、SQL 以外で使用する場合は、各値をエスケープ解除する必要があるためです。

2 番目の解決策はより理にかなっていますが、各値を手動でエスケープするのは面倒です。

プリペアド ステートメントは知っていますが、MySQLiは面倒です。また、クエリを入力から分離することも気になります。順序を正しくすることは重要ですが、間違いを犯しやすく、間違ったデータを間違ったフィールドに書き込んでしまうからです。

4

5 に答える 5

10

準備されたステートメントが最良の答えです。間違いを犯す可能性があるため、テストがあります。

この質問を参照してください。

于 2008-09-05T23:44:24.340 に答える
7

@Rob Walker が述べているように、パラメーター化されたクエリが最善の策です。最新かつ最高の PHP を使用している場合は、PDO (PHP データ オブジェクト) を確認することを強くお勧めします。これは、さまざまなデータベース (もちろん MySQL を含む) と、名前付きパラメーターを使用した準備済みステートメントをサポートするネイティブ データベース抽象化ライブラリです。

于 2008-09-06T00:04:10.500 に答える
1

準備済みステートメントを使用します。プリペアド ステートメントを使用する場合は、おそらく PHP 用の PDO 関数を確認することをお勧めします。これにより、準備されたステートメントを簡単に実行できるようになるだけでなく、mysql_、mysqli_、または pgsql_ で始まる関数を呼び出さないようにすることで、データベースに依存しなくなります。

于 2008-09-06T00:05:05.053 に答える
0

PDO はいつの日か価値のあるものになるかもしれませんが、まだそれだけではありません。これは DBAL であり、その強みは (おそらく) ベンダー間の切り替えをより簡単にすることです。SQLインジェクションをキャッチするように構築されているわけではありません。

とにかく、入力をエスケープしてサナタイズしたい場合は、準備されたステートメントを使用することが適切な手段になる可能性があります(私はそれを支持します)。たとえばfilterを利用することで、はるかに簡単だと思いますが。

于 2008-09-06T01:14:55.510 に答える
-1

$_GET99% の確率で、 、$_POST、およびの変数$_COOKIEがブラウザーに出力されないため、私は常に最初のソリューションを使用してきました。また、(クエリで引用符を使用しない限り) SQL インジェクションで誤ってコードを記述することはありませんが、2 番目のソリューションでは、最終的に文字列の 1 つをエスケープするのを簡単に忘れる可能性があります。

実際、私がいつもそうしてきた理由は、すべてのサイトでデフォルトで magic_quotes 設定がオンになっているためでした。これら 2 つのソリューションのいずれかを使用して多くのコードを記述した後は、変更に多くの作業が必要になります。もう一方に。

于 2008-09-05T23:58:08.550 に答える