2011-12-05 4 views
6

エスケープする代わりにcast(int)を使用するのは安全ですか?

class opinion 
{ 
    function loadbyopinionid($opinionid){ 
     $opinionid=(int)$opinionid; 
     mysql_query("select * from fe_opinion where opinionid=$opinionid"); 
     //more code 
    } 
} 
+3

あなたはパラメータを使用する必要があります。 – SLaks

+0

を使用すると、一見SQLコンテキスト内の文字列としてそれを使用していないので、 '_escape_stringでエスケープ、その後INTVAL($ fooという)perfomanter小さいです'は役に立ちません。 – mario

答えて

13

mysql_real_scape_stringはSTRINGSためです。それは整数を使用するために「安全」にしません。例えばそこにはSQLのメタ文字がありませんので

$safe = mysql_real_escape_string($_GET['page']); 

$_GET['page'] = "0 = 0"; 

何もしません。あなたのクエリは、その0=0はプレーン0に変換されます)(INTVALをやって、しかし

SELECT ... WHERE somefield = 0 = 0 

のようなものを終わるでしょう。

+2

正確に'(int)$ value'は安全ですが、しかし、 '(int) '5abc" === 5'のような副作用があることを覚えておかなければなりません。だから、与えられた文字列は単に 'ctype_digit()'を使って数字だけであることを検証するべきです。 – apfelbox

+0

同意しないでしょう...誰かが整数が期待されていたところで文字列を渡すかもしれないので...すべてのパラメータでそれを使うのがはるかに安全です。 –

-3

はい、それは安全ですが、あなたは「クエリ ..where opinionid = '$のopinionid' に

を値をエスケープする必要がありBTW (1)を選択* ソリューションを選択フィールド、フィールド2を使用しないでください.. ..

(2)(int型)$ fooが

+0

私が覚えているように、intval()はintよりも遅い(目に見えないので、通常は努力する価値のない微調整)。 –

関連する問題