2011-08-03 9 views
0

文字列$ titleは英数字の小文字または " - "のみであると想定されます。

この状況では、セキュリティ上の脆弱性に対する効率的な防御はどれですか?

$title=$_GET["title"]; 
$title = strtolower(preg_replace("/[^a-z0-9\-]+/i", "-", $title)); 
< mysql query using $title goes here > 

OR

$title=$_GET["title"]; 
$title = mysql_real_escape_string($title); 
< mysql query using $title goes here > 
+1

あなたはダムや時代遅れのmysql_ *関数を使用するのが大好きならば、あなたは 'mysql_real_escape_string'を使用する必要があります*** ***、すべての***の値***について。 – mario

答えて

0

SQLクエリを逃れるために、独自のエスケープメソッドを使用しないでください。データベースサーバはそれを使ってより良い仕事をします。

質問に答えるには、正規表現は一般的に非常に遅いです。私は関数呼び出しがはるかに高速になると思います。

また、ユーザーが入力することは決してありません。

0

私はmysql_real_escape_stringを使用します。これはmysql注入の問題の大半を取り除きます。タイトルが存在しない場合(たとえば、誰かがmysqlインジェクションを実行しようとしているなど)、行が見つからないため、404エラーを表示します。

2

両方を実行する必要があります。

$title = strtolower(preg_replace("/[^a-z0-9\-]+/i", "-", $title)); 
And then $title = mysql_real_escape_string($title); 

それは、あなたのmysqlの値をエスケープすることは常に良い習慣だ。この場合には、それはそれを逃れるために有用ではないですが、もし将来的には、タイトルの変更に関するルール、あなたは任意の文字を入れることができ、多分あなたはしませんそれを変更することを忘れないでください

+0

mysql_real_escape_string()は、preg_replace(...)を通過した後に文字列に何もしません。エスケープする必要のない英数字とダッシュを含みます。 – nobody

+0

もちろん、それは私が意味していた:この現在のケースでは、正規表現のためにタイトルをエスケープするのは役に立たないが、もし彼が1ヶ月でタイトルが何でもできると判断し、正規表現を取り除くなら。彼がそれを逃れることを忘れてしまったコードの複雑さにもよります。だから役に立たなくても彼はそれを保つべきだ。 – yokoloko

0

両方の組み合わせ。正規表現が広範でないかもしれないことを覚えておく必要があります。

0

あなたは入力をサニタイズしません!

データの出力先に適した方法を使用して、入力を検証(つまり受け入れるか拒否)し、出力をサニタイズ(つまり表現を変更)します。

したがって:常に

if (preg_match("/^[a-z0-9\-]+$/i", $_GET['title'])) { 
    $my_title=mysql_real_escape_string(strtolower($_GET['title'])); 
    $sql=....'$my_title'.... 
} else { 
    print "Invalid value for title"; 
    exit; 
} 
関連する問題