95

DB接続なしでドライテストを行う必要がある場合があるため、データベースに接続せずに mysql_real_escape_string として動作する関数が必要です。mysql_escape_string は推奨されていないため、望ましくありません。私の発見のいくつか:

http://www.gamedev.net/community/forums/topic.asp?topic_id=448909

http://w3schools.invisionzone.com/index.php?showtopic=20064

4

4 に答える 4

77

DB 接続なしで文字列を安全にエスケープすることは不可能です。mysql_real_escape_string()適切な文字セットを使用して文字列をエスケープできるように、準備されたステートメントにはデータベースへの接続が必要です。そうしないと、マルチバイト文字を使用した SQL インジェクション攻撃が依然として可能です。

のみをテストしている場合はmysql_escape_string()、SQL インジェクション攻撃に対して 100% 保証されているわけではありませんが、DB 接続なしでより安全なものを構築することは不可能です。

于 2009-07-22T00:53:58.510 に答える
69

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);
}
于 2009-07-22T00:44:11.250 に答える
6

さらに調査したところ、次のことがわかりました。

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 も参照してください。

于 2009-07-25T07:48:34.800 に答える