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


84

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

:私は見てきました 挿入エスケープ文字Javaでのすべてのエスケープ文字は何ですか?addcslashes()で文字列エスケープカントエスケープ文字をmysql_real_escape_stringのないものを()本当に?phpの文字列から二重引用符をエスケープするにどうすればよいですか?MySQL_real_escape_stringはスラッシュを追加していませんか?phpの文字列からエスケープシーケンスを削除します。続行できますが、要点はわかります。これは怠惰ではありません。


10
PS友達に聞いて、自分を馬鹿にすることはできなかったかもしれませんが、みんなが話していることは何なのかと思っている人がたくさんいると思いました。
ブレット2012年

回答:


136

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

"Hello World."

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

"Hello "World.""

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

'Hello "World."'

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

"Hello \"World.\""

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

クエリに関しては、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_slashesaddcslashesquotemetaあなたは目標はにより、安全なクエリを実行することで、大規模な開発者が好むときことがわかりますが、より多くの、およびmysql_real_escape_stringまたはpg_escape_stringPostgreSQLの文脈の中で(。


6
SQLインジェクションの問題に対処するために文字列エスケープを実行することは悪い習慣と見なされ、適切に実行されない場合(特に特定の種類の不正な形式のマルチバイト文字攻撃を処理する場合)、セキュリティの問題に簡単につながる可能性があることに注意してください。このため、文字列エスケープは絶対に行わず、代わりにパラメータ化されたSQLクエリまたはストアドプロシージャを使用してください。
Cheekysoft 2012年

22

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

以下の場合にはmysql_real_escape_string()、それはエスケープ\x00\n\r\'"および\x1aこれらのように、エスケープしていないときには、MySQLデータベースとSQL注射、前述の問題を引き起こす可能性があります。


1

簡単にするために、基本的にバックスラッシュ "\"は実行時のインタプリタへのコマンドであると想像できます。

たとえば、このステートメントを解釈している間:

$txt = "Hello world!";

字句解析フェーズの間(または個々のトークンへの声明まで分割する場合)これらはトークンが識別される $txt="Hello world!"、および;

ただし、文字列内のバックスラッシュにより、トークンの追加セットが発生し、直後の文字で何かを実行するコマンドとして解釈されます。たとえば、

$txt = "this \" is escaped";

次のトークンでの結果: $txt="this\"is escaped"、および;

インタプリタは、\トークンを継承する文字に基づいて何をすべきかをすでに知っています(または事前に設定されたルートを持っています)。したがって、その場合は"、文字列の終わりコマンドとしてではなく、文字として扱います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.