13

SQL インジェクションをなくしたいのですmysqli_real_escape_string()が、mysqli を使用する必要がありますか? 例えば

$nick = mysqli_real_escape_string($_POST['nick'])
4

2 に答える 2

23

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

この例は、ドキュメントから取得されます。

/* 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ますが、これを行わないことをお勧めします。可能な限り、常にパラメーターを使用してください。

関連している

于 2012-12-23T14:52:03.593 に答える
2

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

コードで生の API 関数を使用することを計画している場合 (これは明らかに間違った慣行ですが、地元の人々によって非常に普及しています) - 準備されたステートメントを使用することをお勧めします。

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

于 2012-12-23T14:56:24.337 に答える