ユーザーの入力が MySQL クエリに挿入されるときに、ユーザー入力で置き換える必要がある危険な文字は何ですか? 引用符、二重引用符、\r および \n については知っています。他にもありますか?
(パラメータを受け入れるスマートコネクタを使用するオプションがないため、クエリを自分で作成する必要があります。これは、いくつかのあいまいなものを含む複数のプログラミング言語で実装されるためmysql_real_escape_string
、PHP などのソリューションは有効ではありません)
2 に答える
mysql.com ドキュメントの mysql_real_escape_string() :
from の文字列は、接続の現在の文字セットを考慮して、エスケープされた SQL 文字列にエンコードされます。結果は to に配置され、終端の null バイトが追加されます。エンコードされた文字は、NUL (ASCII 0)、「\n」、「\r」、「\」、「'」、「"」、および Control-Z (セクション 8.1「リテラル値」を参照) です。(厳密に言えば、 MySQL では、バックスラッシュと、クエリで文字列を引用するために使用される引用文字のみをエスケープする必要があります.この関数は、ログ ファイルで読みやすくするために、他の文字を引用します.)
mysql_real_escape_string()は文字セットに対応しているため、そのすべての機能を (特にマルチバイト攻撃の問題に対して) 複製するのは、簡単な作業ではありません。
http://cognifty.com/blog.entry/id=6/addslashes_dont_call_it_a_comeback.htmlから:
AS = 追加スラッシュ() MRES = mysql_real_escape_string() ACS = addcslashes() //"\\\000\n\r'\"\032%_" で呼び出される 機能 AS MRES ACS 引用符、二重引用符、バックスラッシュをエスケープする yes yes yes LIKE 修飾子をエスケープします: アンダースコア、パーセント いいえ いいえ はい バックスラッシュの代わりに一重引用符でエスケープする いいえ はい*1 いいえ 文字セット対応 いいえ はい*2 いいえ マルチバイト攻撃を防ぎます いいえ はい*3 いいえ
どの言語をサポートする必要がありますか? 独自のサニタイズを作成するよりも、言語に組み込まれているサニタイズを使用する方がはるかに優れています。
編集:mysql_real_escape_string
php.netを見る:
mysql_real_escape_string()
は、MySQL のライブラリ関数 を呼び出します。この関数は、、、、、、、およびのmysql_real_escape_string
文字の前にバックスラッシュを\x00
追加\n
します。\r
\
'
"
\x1a