4

私が常に混乱しているのは、入力エスケープと、SQL インジェクションなどの攻撃から保護されているかどうかです。

HTTP POST を使用して PHP ファイルにデータを送信するフォームがあるとします。入力フィールドに次のように入力し、フォームを送信します。

"Hello", said Jimmy O'Toole.

この POST データを受け取る PHP ページの入力を印刷/エコーすると、次のようになります。

\"Hello\", said Jimmy O\'Toole.

ここがややこしいポイントです。この入力文字列を (My)SQL に入れて実行すると、(引用符がエスケープされるため) データベースに正常に入力されますが、SQL インジェクションは停止しますか?

入力文字列を取得して次のようなものを呼び出すと、次のようmysqli real_escape_stringになります。

\\"Hello\\", said Jimmy O\\'Toole.

したがって、(My)SQL 経由でデータベースに入ると、次のようになります。

\"Hello\", said Jimmy O\'Toole.

これには明らかにスラッシュが多すぎます。

では、入力が HTTP POST を介してエスケープされたものである場合、(My)SQL に対して安全にするために再度エスケープする必要がありますか? それとも、ここで明らかな何かが見えないだけですか?

助けてくれてありがとう。

4

5 に答える 5

11

ああ、魔法の名言の素晴らしさ。POSTフォームから不要なエスケープを行っています。それらを無効にする(または無力化する)必要があります。そうすれば、頭痛の多くはなくなります.

このテーマの記事の例を次に示します: http://www.sitepoint.com/blogs/2005/03/02/magic-quotes-headaches/

要約: マジック クォートを無効にし、 を使用しますreal_escape_string()

于 2009-01-19T09:38:55.973 に答える
3

エスケープに頼る代わりに、パラメータ化された SQL クエリを使用し、必要なエスケープはすべて mysql ドライバーに任せます。

于 2009-01-19T09:42:32.127 に答える
1

何が起こっているかというと、PHP 構成でMagic Quotesがオンになっているということです。

マジック クォートをオフにすることを強くお勧めします。実際、マジック クォートは PHP 6 から完全に削除されています

マジック クォートを無効にすると、POST されたテキストがフォームに入力したとおりに返される"Hello", said Jimmy O'Toole. のがわかります。文字列をエスケープするのを忘れないでください)。

于 2009-01-19T09:44:37.257 に答える
1

PHP サーバーでマジック クォート機能が有効になっているようです。これが、最初のスラッシュ セットの由来です。理論的には、エスケープ関数を呼び出す必要はありませんが、魔法の引用符が無効になっているサーバーでアプリを実行すると、そうではないと思っている間に突然 SQL インジェクションにさらされてしまいます。

chakrit が書いたように、エスケープは自分自身を守る最善の方法ではありませ

于 2009-01-19T09:45:13.697 に答える
0

明白なことは、ハッカーのキーワードです。

通常のエスケープで十分だと思いますが、引用符だけから保護するだけでは不十分かもしれません。

このSQL インジェクションチートシートを参照してください。これは、実行できるテストの優れたリストであり、スラッシュが多すぎることが良いことかどうかを確認できます。

また、他の種類の値もエスケープすることを忘れないでください。つまり、数値フィールドと日時フィールドはすべて、文字列と同じくらい簡単に挿入できます。

于 2009-01-19T09:36:27.163 に答える