3

私が読んだすべてのブログ/記事/Q&Aで、によって返される値を確認することを提案した人は誰もいませんでしたmysql_real_escape_string()

私の見方では、このチェックはデータの一貫性を確保するために非常に重要です。この関数が失敗した場合、データベースに挿入される値は偽陽性になるためです。ブールFALSEは文字列として型キャストされ、結果は空の文字列になります。あなたが期待するでしょう。

ドキュメントによると:

Returns the escaped string, or FALSE on error. 

A MySQL connection is required before using mysql_real_escape_string() otherwise an error of level E_WARNING is generated, and FALSE is returned. If link_identifier isn't defined, the last MySQL connection is used. 

ログを調べて何が起こったかを確認する場合、警告は適切ですが、発生を防ぐことはできません。

失敗する変更はほとんどないことは知っていますが、少なくとも1つの変更がある場合は、アプリケーションで予期される必要があります。

この関数は、次の場合に失敗します。

  • 開発者は、この関数を呼び出す前にデータベースに接続しませんでした
  • この関数を呼び出す前にデータベースへの接続に失敗しました
  • サーバー(mysqlクライアントが存在する場所)のメモリが少なく、エスケープするために文字列をコピーできません
  • ..。

これは「通常の」使用法の例です。

$db = mysql_connect() or die('Cannot connect to database');
$value = mysql_real_escape_string($_POST['value'], $db);
mysql_query('insert into tablex (value) values ("'.$value.'")', $db) or die('Cannot insert data in database');

私はこのようなものを使用しています(mysqlのOOラッパーで):

class mywrapper{
    // ... [code ...]

    // $this->db is the mysql link identifier
    public function escape($string)
    {
        if(mysql_real_escape_string($string, $this->db) === false)
        {
            throw new Exception('Some message');
        }
    }
} // end class    

    // I'm calling it as 
    // $myWrapper->insert('insert into tablex (value) values ("'.($myWrapper->escape($value)).'")');

これにより、例外ハンドラーによってキャプチャされる例外がスローされます。最も重要なのは、データベースへの誤検知値の挿入を防ぎ、データの一貫性を確保することです。

私は何かが欠けていますか?私は安全に遊んでいますか、それとも妄想的ですか?:)

4

3 に答える 3

2

mysql_ファミリーの関数を使用することはもはや推奨されていないため、ある意味で何かが欠けています。代わりに、mysqliまたはPDOを使用してください。これらは両方とも、入力データを自動的にエスケープするパラメーター化されたクエリを提供します。

于 2012-04-25T12:18:36.377 に答える
0

いいえ、あなたが妄想しているとは思いません。(または私たちは両方ともパラノイドです)

私も、mysqlクエリを送信しないようにすることは間違いなく良い習慣だと思います(値付き変数nothingを送信したくない場合とほとんど同じです)。nothing$_POST

于 2012-04-25T12:11:44.247 に答える
-1

私はあなたが言及した問題に気づきました:

これは「通常の」使用法の例です。

$ db = mysql_connect();

さて、この時点で、接続が成功したことを確実に確認する必要があります。また、優れたデータベース抽象化レイヤーを使用すると、ユーザーがデータベースへの接続を「忘れる」のを防ぐことができます(手動で接続する必要がないため)。(1)。

その間に接続が失われると、クエリは失敗するため、何を送信したかは関係ありません(2)。

mysql_real_escape_stringクライアント側で行われるため、mysqlサーバーのメモリ使用量は問題になりません(3)。

于 2012-04-25T12:16:41.070 に答える