3

PHP でプリペアド ステートメントが必要であることを実証しようとしましたが、PHP はフォームを介して渡された文字列を使用して便利で奇妙なことを行うため、少し問題が発生しました。

私が「壊そうとしている」ステートメントは簡単です:

SELECT username FROM users WHERE username = '$username' AND password = '$password'

X' or TRUE;--しかし、PHP は自動的に単一引用符をエスケープし、ステートメントを次のように変換するため、パスワードを渡すようなことは実際には機能しません。

SELECT username FROM users WHERE username = '$username' AND password = 'X\' or TRUE;--'

また、一重引用符がエスケープされているため、パスワードの等価性は損なわれません。このステートメントは安全と見なされますか? そうでない場合、どうすれば壊れますか?

4

2 に答える 2

5

魔法の引用符がオンになっているようです。PHP 5.4 を実行しているサーバーに移動すると、完全に脆弱になるため、そのステートメントが安全であるとは絶対に考えません。マジック クォートは長い間非推奨の機能であり、アプリケーションの他の部分を台無しにする可能性があるため、これに依存しないでください。

実証するにはmagic_quotes_gpc = Off、php.ini で設定するだけです。

于 2012-05-26T16:27:51.243 に答える
2

これは、PHP環境でMagicQuotesが有効になっているためです。文字列は自動的にエスケープされますが、非推奨であり、使用しないでください。それらは治療法ではなく、パッチです。のような適切な衛生方法を使用する方がはるかに優れていますmysql_real_escape_string

http://www.php.net/manual/en/security.magicquotes.what.php

編集:プリペアドステートメント!

PHPの他の「安全でない」安全な関数:

addslashes-安全だと思うかもしれませんが、インジェクションの原因となる可能性のあるマルチバイト文字は除外されません。

于 2012-05-26T16:28:47.280 に答える