重複の可能性:
PHPでSQLインジェクションを防ぐための最良の方法
SQLインジェクションについて疑問に思っており、mysqli_real_escape_stringをいつ使用するかを知りたいです。
クエリにWHERE句があるたびに使用する必要がありますか?
重複の可能性:
PHPでSQLインジェクションを防ぐための最良の方法
SQLインジェクションについて疑問に思っており、mysqli_real_escape_stringをいつ使用するかを知りたいです。
クエリにWHERE句があるたびに使用する必要がありますか?
ユーザーからのデータまたは信頼できないデータには、mysqli_real_escape_string を使用する必要があります。
クエリに$_REQUEST"vars"を含める場合は、これを使用する必要があります。
$query = "UPDATE foo set bar = '{$_GET['var']}' ..."
$query = "INSERT INTO foo ('{$_POST['var']}',) ..."
$query = "SELECT bla from foo WHERE bar = '{$_COOKIE['var']}'"
インジェクションを提供するには、この各クエリはmysqli_real_escape_stringである必要があります...
またはそのバリエーションを使用mysqli_real_escape_string
して、ユーザー入力フィールドからのデータが適切にエスケープされるようにします。
たとえば、いくつかの入力があるフォームがあるとします。[送信] をクリックすると、データがリクエストとして PHP スクリプトに送信されます。スクリプトでは、ユーザーが投稿した値をデータベースに挿入します。
たとえば、ユーザーがログイン時に入力フィールドに次のように入力したとします。
' WHERE `username` = {x} AND password > 1;
その人物が、作業中のテーブルのすべてのデータを持っている可能性があります。使用:
mysqli_real_escape_string($input)
上記は次のようになります。
\' WHERE `username` = {x} AND password > 1;
' のエスケープ文字列は、SQL インジェクション攻撃の可能性を阻止します。
つまり、PDO とバインドされたパラメーターを使用する必要がある理由はありませんmysqli_real_escape_string()
。さまざまな SQL 攻撃/注入方法のホストをそらすのにはるかに優れています。それを学び、それを使用してください!
コメントのため編集
%
また_
、それ以上の特別な扱いが必要になりますmysqli_real_escape_string()
function escape_extra_chars ( $string )
{
$string = preg_replace("/\%/", "\%", $string);
$string = preg_replace("/\_/", "\_", $string);
return $string;
}
とにかくそれらの線に沿って(その機能はテストされていません)