DB接続なしでドライテストを行う必要がある場合があるため、データベースに接続せずに mysql_real_escape_string として動作する関数が必要です。mysql_escape_string は推奨されていないため、望ましくありません。私の発見のいくつか:
http://www.gamedev.net/community/forums/topic.asp?topic_id=448909
DB接続なしでドライテストを行う必要がある場合があるため、データベースに接続せずに mysql_real_escape_string として動作する関数が必要です。mysql_escape_string は推奨されていないため、望ましくありません。私の発見のいくつか:
http://www.gamedev.net/community/forums/topic.asp?topic_id=448909
DB 接続なしで文字列を安全にエスケープすることは不可能です。mysql_real_escape_string()
適切な文字セットを使用して文字列をエスケープできるように、準備されたステートメントにはデータベースへの接続が必要です。そうしないと、マルチバイト文字を使用した SQL インジェクション攻撃が依然として可能です。
のみをテストしている場合はmysql_escape_string()
、SQL インジェクション攻撃に対して 100% 保証されているわけではありませんが、DB 接続なしでより安全なものを構築することは不可能です。
mysql_real_escape_string関数のリファレンス ページによると、「mysql_real_escape_string() は MySQL のライブラリ関数 mysql_real_escape_string を呼び出し、\x00、\n、\r、\、'、"、\x1a の文字をエスケープします。」
それを念頭に置いて、投稿した2番目のリンクにある関数は、必要なことを正確に実行する必要があります。
function mres($value)
{
$search = array("\\", "\x00", "\n", "\r", "'", '"', "\x1a");
$replace = array("\\\\","\\0","\\n", "\\r", "\'", '\"', "\\Z");
return str_replace($search, $replace, $value);
}
さらに調査したところ、次のことがわかりました。
http://dev.mysql.com/doc/refman/5.1/en/news-5-1-11.html
マルチバイト エンコーディング処理で SQL インジェクション セキュリティ ホールが発見されました。このバグはサーバーにあり、mysql_real_escape_string() C API 関数でエスケープされた文字列を正しく解析していませんでした。
この脆弱性は、OSDB コンソーシアムのプロジェクト間セキュリティ コラボレーションの一環として、Josh Berkus と Tom Lane によって発見され、報告されました。SQL インジェクションの詳細については、次のテキストを参照してください。
討論。マルチバイトエンコーディング処理にSQLインジェクションのセキュリティホールが発見されました。SQL インジェクション セキュリティ ホールには、ユーザーがデータベースに挿入するデータを提供したときに、サーバーが実行するデータに SQL ステートメントを挿入する可能性がある状況が含まれる場合があります。この脆弱性に関して、文字セットを認識しないエスケープ (PHP の addslashes() など) を使用すると、一部のマルチバイト文字セット (SJIS、BIG5、GBK など) でエスケープをバイパスすることが可能です。その結果、addslashes() などの関数は SQL インジェクション攻撃を防ぐことができません。これをサーバー側で修正することは不可能です。最良の解決策は、アプリケーションが mysql_real_escape_string() などの関数によって提供される文字セットを認識するエスケープを使用することです。
ただし、MySQL サーバーが mysql_real_escape_string() の出力を解析する方法にバグが検出されました。その結果、文字セット対応関数 mysql_real_escape_string() を使用した場合でも、SQL インジェクションが可能でした。このバグは修正されました。
回避策。MySQL を mysql_real_escape_string() 解析のバグの修正を含むバージョンにアップグレードできないが、MySQL 5.0.1 以降を実行している場合は、回避策として NO_BACKSLASH_ESCAPES SQL モードを使用できます。(このモードは MySQL 5.0.1 で導入されました。) NO_BACKSLASH_ESCAPES は、バックスラッシュが特殊文字と見なされない SQL 標準互換モードを有効にします。その結果、クエリは失敗します。
現在の接続に対してこのモードを設定するには、次の SQL ステートメントを入力します。
SET sql_mode='NO_BACKSLASH_ESCAPES';
すべてのクライアントに対してグローバルにモードを設定することもできます。
SET GLOBAL sql_mode='NO_BACKSLASH_ESCAPES';
この SQL モードは、コマンドライン オプション --sql-mode=NO_BACKSLASH_ESCAPES を使用するか、サーバー オプション ファイル (たとえば、my.cnf または my.ini 、システムによって異なります)。(バグ #8378、CVE-2006-2753)
バグ #8303 も参照してください。