2008-08-05 7 views
18

SQLクエリを実行するときに、文字列を消去するか、ユーザーがWebサイトで悪質なSQLを実行する必要があります。クエリを送信するときにエスケープする必要があるのは何ですか?

  • は、ダブルエスケープ(\\)とエスケープ(\)を置き換えます:

    は、私は通常ちょうど機能escape_string(何とか)を、持っています。

  • 一重引用符(')をエスケープした一重引用符(\')に置き換えます。

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

私はPerl、Java、およびPHPで優雅なソリューションを見たいと思います。

+0

何かがラインで、バックスラッシュの表示に間違っていなければなりません 'ダブルエスケープ(\)でエスケープを()に置き換えます。' – bart

答えて

0

どの言語が使用されていますか?それらのほとんどすべてに、組み込みのSQLエスケープ関数があり、使用する方が良いと思われます。

たとえば、PHPはmysql_real_escape_stringおよびaddslashesです。

2

私はまた、あなたが、プレースホルダとのプリペアドステートメントを使用して、より良いオフにしているコメント(ダブルダッシュ)

-- 
0

をエスケープします。あなたはPHP、.NETを使用していますか...どちらの方法でも、準備されたステートメントはより多くのセキュリティを提供しますが、サンプルを提供できます。

-1

MySqlがパラメータ化されたクエリをサポートするかどうかわかりませんが、もしそうなら、あなたはこのルートに進むよう努力するべきです。これにより、ユーザーの入力が何か悪意のある行為を行うことができなくなります。

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

0

、私はこの1つを使用していると私はそれについてのすべてのコメントを感謝します:フィールドがNULL可能ならば

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

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

楽しい ! (投稿が正しく下線を送ってくれることを願って、_を入れないようにしてください)

1

PHPで使える素晴らしいものはPDOです。あなたのSQL(そしてあなたのSQLの全般的なもの)を保護することには、多くの推測が必要です。これは準備されたステートメントをサポートしており、SQLインジェクション攻撃を阻止するのに役立ちます。

PDOの素晴らしいプライマーは、本The PHP Anthology 101 Essential Tips, Tricks & Hacks by Davey Shafik etc. 2nd Edに含まれています。風習を学び、参考になります。私は実際のSQLクエリ以外のことについても考える必要はありません。

0

使用準備/パラメータ化クエリ: は、ここでPHPを含め、さまざまな言語で多くの例でこれを行う方法です!

0

MySQL C APIの所有者はmysql_escape_string()です。それを使用するか、それと同等のものが最適です。

0

準備文を使用してください。

0

MySQLクエリでLIKEを使用する場合は、mysql_real_escape_stringでエスケープされていないので、 "_"文字をエスケープしてください。参考のため

、チェックhere

関連する問題