web-dev-qa-db-ja.com

文字列をエスケープするとはどういう意味ですか?

SQLクエリに入る前に$ _SESSION ['username']をエスケープする必要がありますか? そして、「Originに関係なく、SQLクエリに渡すすべての文字列をエスケープする必要があります「。今、私はこのようなことが本当に基本的であることを知っています。 Googleの検索結果は2万件を超えました。 Stackoverflowだけでも20ページの結果がありましたが、実際に文字列をエスケープする方法やその方法を説明している人はいません。想定されているだけです。手伝って頂けますか?いつものように、PHPでWebアプリを作っているので、学びたいです。

私は見てきました: エスケープ文字の挿入Javaのすべてのエスケープ文字とは?addcslashes() で文字列をエスケープする、- エスケープ文字mysql_real_escape_string()は実際に何をしますか?phpの文字列から二重引用符をエスケープするにはどうすればよいですか?MySQL_real_escape_stringスラッシュを追加しませんか?phpの文字列からエスケープシーケンスを削除します 先に進むことはできますが、ポイントは得られると確信しています。これは怠ではありません。

70
Brett

文字列をエスケープすると、その文字列で使用される引用符(およびその他の文字)のあいまいさが軽減されます。たとえば、文字列を定義する場合、通常は二重引用符または一重引用符で囲みます。

_"Hello World."
_

しかし、文字列に二重引用符が含まれているとどうなりますか?

_"Hello "World.""
_

今、私にはあいまいさがあります-インタープリターは私のストリングがどこで終わるのかわかりません。二重引用符を保持したい場合、いくつかのオプションがあります。文字列を単一引用符で囲むことができます。

_'Hello "World."'
_

または、引用符をエスケープできます。

_"Hello \"World.\""
_

スラッシュが前に付いている引用符はescapedであり、文字列の値の一部であると理解されます。

クエリに関しては、MySQLには、混乱を引き起こさずにクエリで使用できない特定のキーワードがあります。列に「Select」という名前の値のテーブルがあり、それを選択したいとします。

_SELECT select FROM myTable
_

これで、クエリにいくつかのあいまいさが導入されました。クエリ内で、バックティックを使用してそのあいまいさを減らすことができます。

_SELECT `select` FROM myTable
_

これにより、フィールド名を選択する際に不適切な判断を使用することで生じた混乱が解消されます。

mysql_real_escape_string() を介して値を渡すだけで、これの多くを処理できます。以下の例では、クエリに対して問題が発生しないように、この関数を介してユーザーが送信したデータを渡していることがわかります。

_// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
            mysql_real_escape_string($user),
            mysql_real_escape_string($password));
_

_add_slashes_、addcslashesquotemetaなど、文字列をエスケープするためのその他のメソッドがありますが、目的が安全なクエリを実行することである場合、大規模な開発者は_mysql_real_escape_string_または_pg_escape_string_を好みます(PostgreSQLのコンテキストで。

119
Sampson

一部の文字は、使用しているSQLデータベースにとって特別な意味を持ちます。これらの文字がクエリで使用されている場合、攻撃者によるデータベースの侵害を許可するなど、予期しない動作や意図しない動作が発生する可能性があります。これらの文字がこの方法でクエリに影響を与えないようにするには、エスケープする必要があります。または、別の言い方をすると、このクエリで特殊文字として扱わないようにデータベースに指示する必要があります。

mysql_real_escape_string()の場合、\x00\n\r\'"および\x1aこれらは、エスケープされていない場合、MySQLデータベースでのSQLインジェクションを含む前述の問題を引き起こす可能性があります。

19
John Conde