sql >> データベース >  >> RDS >> Mysql

関数mysql_real_escape_stringに相当するPDOとは何ですか?

    いいえ、ありません!

    技術的には、 PDO::quote()があります。 ただし、これが使用されることはめったになく、<と同等ではありません。強い>mysql_real_escape_string()

    そうです! プリペアドステートメント を使用して文書化されている適切な方法ですでにPDOを使用している場合 、それからそれはあなたをMySQLインジェクションから保護します。

    Example:

    以下は安全の例です プリペアドステートメントを使用したデータベースクエリ(pdo)

      try {
         // first connect to database with the PDO object. 
         $db = new \PDO("mysql:host=localhost;dbname=xxx;charset=utf8", "xxx", "xxx", [
           PDO::ATTR_EMULATE_PREPARES => false, 
           PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
         ]); 
     } catch(\PDOException $e){
         // if connection fails, show PDO error. 
       echo "Error connecting to mysql: " . $e->getMessage();
     }
    

    そして、接続が確立されたと仮定すると、次のようにクエリを実行できます。

    if($_POST && isset($_POST['color'])){ 
    
        // preparing a statement
        $stmt = $db->prepare("SELECT id, name, color FROM Cars WHERE color = ?");
    
        // execute/run the statement. 
        $stmt->execute(array($_POST['color']));
    
        // fetch the result. 
        $cars = $stmt->fetchAll(\PDO::FETCH_ASSOC); 
        var_dump($cars); 
     }
    

    おそらくお分かりのように、$_POST["color"]の値をエスケープ/サニタイズするために何も使用していません。 。そして、このコードは、PDOとプリペアドステートメントの力のおかげでmyql-injectionから安全です。

    charset=utf8を渡す必要があることに注意してください。 属性として、DSN 上記のように、セキュリティ上の理由から、常にPDOが例外の形でエラーを表示できるようにします。

    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    

    したがって、データベースクエリからのエラーは、ディレクトリ構造、データベースユーザー名などの機密データを明らかにしません。

    最後になりましたが、PDOを100%信頼してはいけない場合があり、SQLインジェクションを防ぐためにいくつかの追加の対策を講じる必要があります。そのような場合の1つは、古いバージョンのmysql[ mysql =< 5.3.6 ] この答え

    ただし、上記のようにプリペアドステートメントを使用する方が、mysql_で始まる関数を使用するよりも常に安全です。

    良い読み物

    MySQL開発者向けのPDOチュートリアル



    1. 日付はOracleにどのように保存されますか?

    2. MySQLでの全文検索:良い点、悪い点、醜い点

    3. MySQL:BEGIN&COMMITを使用して同じクエリで複数のテーブルに挿入します

    4. Mysqlクエリで整数を引用することのデメリットは?