21

SQLクエリを実行するときは、文字列をクリーンアップする必要があります。そうしないと、ユーザーがWebサイトで悪意のあるSQLを実行する可能性があります。

私は通常、関数escape_string(blah)を持っています。これは次のとおりです。

  • \エスケープ( )をダブルエスケープ()に置き換えます\\
  • '一重引用符( )をエスケープされた一重引用符()に置き換えます\'

これで十分ですか?私のコードに穴はありますか?これを迅速かつ確実に実行できるライブラリはありますか?

Perl、Java、およびPHPで適切なソリューションを確認したいと思います。

4

11 に答える 11

8

セキュリティ、パフォーマンス、および正確性を最大限に高めるには、準備済みステートメントを使用します。PHPを含むさまざまな言語の多くの例でこれを行う方法は次のとおりです。

https://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks

于 2008-08-05T19:38:51.023 に答える
2

コメントもエスケープします(二重ダッシュ)

--
于 2008-08-05T18:46:45.683 に答える
1

PHP で使用する優れた機能はPDOです。SQL (および一般的なすべての SQL 要素) を保護するために、多くの当て推量が必要になります。これは、SQL インジェクション攻撃の阻止に大いに役立つ準備済みステートメントをサポートしています。

Davey Shafik などによる The PHP Anthology 101 Essential Tips, Tricks & Hacksという本には、PDO に関する優れた入門書が含まれています。学習が楽になり、リファレンスとして優れています。もう実際の SQL クエリ以外のことを考える必要さえありません。

于 2008-08-05T19:28:29.703 に答える
0

MySQLクエリで、LIKEを使用する場合は、mysql_real_escape_stringによってエスケープされないため、必ず「_」文字をエスケープしてください。

参考までに、こちらを確認してください

于 2008-10-14T04:57:04.980 に答える
0

どの言語を使用していますか?それらのほとんどすべてに、より使いやすいSQLエスケープ関数が組み込まれているようです。

たとえば、PHPにはmysql_real_escape_stringaddslashesがあります。

于 2008-08-05T18:46:41.347 に答える
0

プレースホルダー付きのプリペアドステートメントを使用することをお勧めします。PHP、.NETを使用していますか...いずれにしても、プリペアドステートメントはセキュリティを強化しますが、サンプルを提供することもできます。

于 2008-08-05T18:48:23.497 に答える
0

準備済みステートメントを使用します。

于 2008-09-16T21:14:00.753 に答える
0

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 になる可能性がある場合は、もう 1 つの確認が必要です。

$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}';
    ";

それだけです。(投稿が _ ; ではなくアンダースコアを正しく送信することを願っています)

于 2008-08-05T19:21:49.090 に答える
0

準備済み/パラメータ化されたクエリを使用してください!

于 2008-08-05T19:55:12.613 に答える
0

MySQL C API には独自のmysql_escape_string(). それを使用するか、それと同等のものを使用するのが最善です。

于 2008-08-14T17:59:02.597 に答える
-1

MySQLがパラメータ化されたクエリをサポートしているかどうかはわかりません。サポートしている場合は、このルートに進むように努力する必要があります。これにより、ユーザー入力が悪意のあることを実行できないようになります。

そうでなければ、あなたが言及したものに加えて、いくつかの「悪い」文字はセミコロン(;)とコメント(-と/ * * /)になります。

于 2008-08-05T18:49:58.360 に答える