クエリを送信するときに何をエスケープする必要がありますか?
質問
SQL クエリを実行するときは、文字列をクリーンアップする必要があります。そうしないと、ユーザーが Web サイト上で悪意のある SQL を実行する可能性があります。
通常、私は関数escape_string(blah)を持っています。
- エスケープを置き換えます (
\
) 二重エスケープ (\\
). - 一重引用符 (
'
) エスケープされた一重引用符 (\'
).
これで十分でしょうか?私のコードに穴はありますか?これを迅速かつ確実に実行できるライブラリはありますか?
Perl、Java、PHP での優雅なソリューションを見てみたいと思っています。
解決
セキュリティ、パフォーマンス、正確性を最大限に高めるには、準備されたステートメントを使用します。PHP を含むさまざまな言語での多数の例を使用してこれを行う方法を次に示します。
https://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-攻撃
他のヒント
コメントもエスケープします (二重ダッシュ)
--
PHP で使用する素晴らしい点は、 PDO. 。SQL (および SQL 全般全般) のセキュリティを保護するために、多くの当て推量が必要になります。SQL インジェクション攻撃の阻止に大いに役立つプリペアド ステートメントをサポートしています。
PDO に関する優れた入門書がこの本に含まれています PHP アンソロジー 101 の重要なヒント、トリック、ハック (Davey Shafik 著) など。第2版. 。学習が簡単になり、参考書としても最適です。もう実際の SQL クエリ以外のことを考える必要すらありません。
どの言語が使用されていますか?ほとんどすべてに SQL エスケープ関数が組み込まれており、それを使用した方がよいようです。
たとえば、PHP には、 mysql_real_escape_string そして ラッシュを追加します.
プレースホルダーを含む準備済みステートメントを使用することをお勧めします。PHP を使用していますか、.NET を使用していますか...いずれにしても、準備されたステートメントを使用するとセキュリティが強化されますが、サンプルを提供できます。
PHP では、私はこれを使用しています。それに関するすべてのコメントに感謝します。
function quote_smart($valeur)
{
if (get_magic_quotes_gpc())
$valeur = stripslashes($valeur);
if (!is_numeric($valeur))
$valeur = mysql_real_escape_string($valeur);
return $valeur;
}
$IdS = quote_smart($_POST['theID']);
$sql = "
SELECT * FROM Students
WHERE IdStudent={$IdS};
";
フィールドが NULL になる可能性があるかどうかをもう一度確認する必要があります。
$picture = NULL;
$theidyouwant = 7;
$Name = 'WOOD';
if(is_null($picture))
$p = 'NULL';
else
$p = "'".quote_smart($picture)."'";
$IdS = quote_smart($theidyouwant);
$requete = "SELECT * FROM Students
WHERE IdStudent={$IdS} AND
PictureStudent={$p} AND
NameStudent='{$Name}';
";
それだけです、お楽しみください!(投稿が _ ではなくアンダースコアを正しく送信することを願っています)
準備済み/パラメータ化されたクエリを使用してください。
準備されたステートメントを使用します。
MySQL クエリで LIKE を使用するときは、mysql_real_escape_string ではエスケープされないため、「_」文字も必ずエスケープしてください。
参考までにチェックしてください ここ
MySQL C API には独自の API があります mysql_escape_string()
. 。それまたは同等のものを使用するのが最善です。
MySql がパラメータ化されたクエリをサポートしているかどうかはわかりませんが、サポートしている場合は、この方法を採用するよう努力する必要があります。これにより、ユーザーの入力によって悪意のある操作が行われることがなくなります。
そうでなければ、あなたが言及したものに加えて、いくつかの「悪い」文字はセミコロン(;)とコメント(--と/* */)になります。