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

real_escape_stringとprepare()の違いは?

    エスケープは、クエリパラメータを使用するのと同じようにSQLインジェクションの防御に効果的です。

    どちらの方法も、一貫して実行しないと効果が低下します。

    どちらの方法も、個々のを保護する場合にのみ役立ちます。 SQL式で。クエリの他の動的な部分はサポートしていません。たとえば、ユーザー指定の列でORDERBYする場合です。クエリパラメータもエスケープ関数もそれを処理しません。

    つまり、基本的には、スタイルと個人的な好みの問題です。

    私はこれを考えるのでクエリパラメータを好みます:

    $sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES (?, ?, ?)";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$a, $b, $c]);
    

    これよりも明確です:

    $sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES ('".mysqli_real_escape_string($conn, $a)."', '".mysqli_real_escape_string($conn, $b)."', '".mysqli_real_escape_string($conn, $c)."')";
    mysqli_query($conn, $sql);
    

    これらすべてのオープンクォート/クローズクォートと. 文字列の連結は、クエリパラメータでprepare()を使用するよりも簡単です。

    架空のquery()についてのコメントを再確認してください パラメータ付きの関数。

    まず第一に、それは必要ではありません。 prepare()とexecute()を一緒に使用することは、安全なコードを書くための小さな代償であり、単一の関数でそれを行うことを主張することによって、あなたはただ怠惰に聞こえます。 falseを返す関数の戻り値をチェックしないと思います エラーの場合も?

    PHPは暗黙的にvarargsをサポートしているため、その価値については、両方を実行するラッパー関数を簡単に作成できます。

    function myquery() {
      global $pdo;
      $params = func_get_args();
      $sql = array_shift($params);
      $stmt = $pdo->prepare($sql);
      $stmt->execute($params);
      return $stmt; // so we can fetch(), etc.
    }
    



    1. PDO複数クエリ

    2. iPhoneからMySQLデータベースに接続するにはどうすればよいですか?

    3. FILE_IDEX()を使用して、SQLServerのデータベースファイルのIDを返します。

    4. Oracle 11g:クエリが何も返さない場合のデフォルトは静的な値