SQLインジェクションを排除したいのですが、mysqli_real_escape_string()
を使用する必要がありますか、それともmysqliで明確ですか?例えば
$nick = mysqli_real_escape_string($_POST['nick'])
プリペアドステートメント を使用し、文字列データをパラメータとして渡す必要がありますが、エスケープしないでください。
この例は、ドキュメントから抜粋したものです。
/* 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
を使用する必要がありますが、これは絶対に行わないことをお勧めします。可能な限り、常にパラメータを使用してください。
関連
はい。プレースホルダーまたは何らかのクエリビルダーを使用して独自のクエリプロセッサを実装する場合は、mysqli_real_escape_stringを使用して文字列をフォーマットできます。
コードでベアAPI関数を使用することを計画している場合(これは明らかに間違った方法ですが、地元の人々に非常に人気があります)、プリペアドステートメントを使用することをお勧めします。
とにかく、この関数だけを使用して「SQLインジェクションを排除」することはできません。 mysql(i)_real_escape_string
関数は注入を防止しないため、保護のために使用しないでください。