エスケープする代わりにcast(int)を使用するのは安全ですか?
class opinion
{
function loadbyopinionid($opinionid){
$opinionid=(int)$opinionid;
mysql_query("select * from fe_opinion where opinionid=$opinionid");
//more code
}
}
エスケープする代わりにcast(int)を使用するのは安全ですか?
class opinion
{
function loadbyopinionid($opinionid){
$opinionid=(int)$opinionid;
mysql_query("select * from fe_opinion where opinionid=$opinionid");
//more code
}
}
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
のようなものを終わるでしょう。
正確に'(int)$ value'は安全ですが、しかし、 '(int) '5abc" === 5'のような副作用があることを覚えておかなければなりません。だから、与えられた文字列は単に 'ctype_digit()'を使って数字だけであることを検証するべきです。 – apfelbox
同意しないでしょう...誰かが整数が期待されていたところで文字列を渡すかもしれないので...すべてのパラメータでそれを使うのがはるかに安全です。 –
はい、それは安全ですが、あなたは「クエリ ..where opinionid = '$のopinionid' に
を値をエスケープする必要がありBTW (1)を選択* ソリューションを選択フィールド、フィールド2を使用しないでください.. ..
(2)(int型)$ fooが
私が覚えているように、intval()はintよりも遅い(目に見えないので、通常は努力する価値のない微調整)。 –
あなたはパラメータを使用する必要があります。 – SLaks
を使用すると、一見SQLコンテキスト内の文字列としてそれを使用していないので、 '_escape_stringでエスケープ、その後INTVAL($ fooという)perfomanter小さいです'は役に立ちません。 – mario