1. ホーム
  2. php

[解決済み] 文字列をエスケープするとはどういう意味ですか?

2022-03-11 19:59:02

質問

を読んでいました。 SQLクエリに入る前に$_SESSION['username']をエスケープする必要がありますか? と書いてあり、「SQLクエリに渡す文字列は、その出所にかかわらず、すべてエスケープする必要があります"」と書いてありました。このようなことは、本当に基本的なことだとわかっています。Googleで検索すると、20,000件以上ヒットしました。Stackoverflowだけでも20ページはありましたが、文字列のエスケープとは何か、どうすればいいのかを実際に説明している人はいません。ただ、思い込んでいるだけなのです。あなたは私を助けることができますか?私はいつものようにPHPでWebアプリを作っているので、学びたいのです。

見てきました。 エスケープ文字を挿入する , Java のエスケープ文字にはどんなものがありますか? , addcslashes()で文字列をエスケープすることができない , エスケープ文字 , mysql_real_escape_string() は実際に何をするのですか? , php で文字列からダブルクォートをエスケープするにはどうすればよいですか? , MySQL_real_escape_string がスラッシュを追加しない? , php で文字列からエスケープシーケンスを除去する まだまだ続きますが、要点はご理解いただけたと思います。これは怠慢ではありません。

解決するには?

文字列のエスケープとは、その文字列で使用される引用符(およびその他の文字)の曖昧さを減らすことを意味します。例えば、文字列を定義する場合、通常は二重引用符か一重引用符のどちらかで囲みます。

"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_slashes , addcslashes , quotemeta などがありますが、安全なクエリを実行することが目的である場合、開発者は全般的に mysql_real_escape_string または pg_escape_string (PostgreSQLの文脈で。