Php 清理整数数据库输入
我有一个通过POST请求获取数据的应用程序。我正在使用此数据向数据库中插入新行。我知道使用Php 清理整数数据库输入,php,mysql,Php,Mysql,我有一个通过POST请求获取数据的应用程序。我正在使用此数据向数据库中插入新行。我知道使用mysql\u real\u escape\u string()(加上删除%和)是处理字符串的方法,但是整数值呢?现在,我正在对它们使用PHP函数intval() 但是,我想确保intval()是完全安全的。当变量首先通过intval()运行时,我看不到攻击者执行SQL注入攻击的方式(因为它总是返回一个整数),但我想确保经验比我丰富的人会这样做 谢谢。是的,intval()是安全的。当参数转换为整数时,绝对
mysql\u real\u escape\u string()
(加上删除%和)是处理字符串的方法,但是整数值呢?现在,我正在对它们使用PHP函数intval()
但是,我想确保intval()
是完全安全的。当变量首先通过intval()
运行时,我看不到攻击者执行SQL注入攻击的方式(因为它总是返回一个整数),但我想确保经验比我丰富的人会这样做
谢谢。是的,
intval()
是安全的。当参数转换为整数时,绝对没有办法执行SQL注入,因为(显然)整数的格式不允许在其中放入SQL关键字(或引号,或其他任何内容)。防止SQL注入的最简单方法是始终使用准备好的语句。使用mysqli库或更好的ORM,如条令等
然后,您的查询会变成:
$stmt = $db->prep_stmt("select * from .... where userid = ? and username = ?");
/* Binding 2 parameters. */
$stmt->bind_param("is", $userid, $username);
$userid = 15;
$username = "don";
/* Executing the statement */
$stmt->execute( ) or die ("Could not execute statement");
我总是这样
$var = (int)$_POST['var'];
确保$var在所有情况下都作为整数处理,并且不再查看$\u POST['var']。查看手册,intval()的作用与此完全相同
无论您选择哪种方式,子序列中的$var都将是一个实际的整数,这是非常安全的处理方式。预处理语句是处理sql注入的最佳方式。 或者使用PDO
否则,对于准备好的语句,intval优于is_numeric+1。但是,为了避免SQL异常,我仍然会在执行insert之前验证用户输入数据。当然,除非ORM或框架为我这样做。不幸的是,准备好的语句不适用于此特定项目。请注意:如果您处理的数字大于32或64位(取决于您的平台)
intval()
将返回零。如果您试图在数据库中存储非常大的数字,这显然是不可取的。例如,facebook的ID已经有好几年没有32位了@Frank Farmer:Hm。。那很有趣。谢谢你的提醒。如果需要的话,我会研究我们能做些什么来解决这个问题。好的,我就是这么想的。谢谢。您也可以使用(int)$id
,因为强制转换比使用intval($id)
功能快得多。支票:你确定吗?因为intval对作为输入参数的内容有很大的限制。这段代码生成正确的整数结果,但我永远不希望在查询中包含这样的值:$var=“123TYPE\u puggling”;变量转储(是数值($var));var_dump((int)$var);var_dump(intval($var))
intval总是返回int,为什么不返回呢?