web-dev-qa-db-ja.com

mysqli_real_escape_string、使用する必要がありますか?

SQLインジェクションを排除したいのですが、mysqli_real_escape_string()を使用する必要がありますか、それともmysqliで明確ですか?例えば

$nick = mysqli_real_escape_string($_POST['nick'])
13
dontHaveName

プリペアドステートメント を使用し、文字列データをパラメータとして渡す必要がありますが、エスケープしないでください。

この例は、ドキュメントから抜粋したものです。

/* create a prepared statement */
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {

    /* bind parameters for markers */
    $stmt->bind_param("s", $city);

    /* execute query */
    $stmt->execute();

    /* bind result variables */
    $stmt->bind_result($district);

    /* fetch value */
    $stmt->fetch();

    printf("%s is in district %s\n", $city, $district);

    /* close statement */
    $stmt->close();
}

この例では、mysqli_real_escape_string呼び出さないことに注意してください。文字列をクエリに直接埋め込む場合にのみmysqli_real_escape_stringを使用する必要がありますが、これは絶対に行わないことをお勧めします。可能な限り、常にパラメータを使用してください。

関連

23
Mark Byers

はい。プレースホルダーまたは何らかのクエリビルダーを使用して独自のクエリプロセッサを実装する場合は、mysqli_real_escape_stringを使用して文字列をフォーマットできます。

コードでベアAPI関数を使用することを計画している場合(これは明らかに間違った方法ですが、地元の人々に非常に人気があります)、プリペアドステートメントを使用することをお勧めします。

とにかく、この関数だけを使用して「SQLインジェクションを排除」することはできません。 mysql(i)_real_escape_string関数は注入を防止しないため、保護のために使用しないでください。

2