我应该使用mysql_real_escape_string转义预期的整数值,还是可以直接使用(int)$expectedinteger?

8
使用 (int) 转换而不是转义是否安全?
class opinion
{
   function loadbyopinionid($opinionid){
      $opinionid=(int)$opinionid;
      mysql_query("select * from fe_opinion where opinionid=$opinionid");
      //more code 
   }
}

由于您似乎没有在 SQL 上下文中使用它作为字符串,因此使用 _escape_string 转义它将毫无意义。 - mario
2个回答

13

mysql_real_escape_string 用于处理字符串,它不会使整数安全可用。例如:

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

在这种情况下不会执行任何操作

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

因为这里没有SQL元字符。你的查询最终会变成这样

SELECT ... WHERE somefield = 0 = 0

然而,使用intval()将会把那个0=0转换成一个普通的0


2
没错。(int) $value 是安全的,但是需要记住,有副作用,例如 (int) "5abc" === 5。因此,应该验证给定的字符串是否只是一个数字,例如使用 ctype_digit() - apfelbox
不会同意...因为有人可能传递字符串,而期望的是整数...使用所有参数更安全。 - Flash Thunder

-3

是的,这是安全的,但你应该在查询中转义值,例如 opinionid='$opinionid'。

另外, (1) 永远不要使用 Select *,而是使用 Solution Select Field, Field2 .... (2) (int)$foo 的性能比 intval($foo)差。


据我所记,intval() 比 (int) 慢(微小的改进通常不值得付出努力,因为这种差异对肉眼来说是不可见的)。 - Kevin Van Ryckegem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接