Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 清理整数数据库输入_Php_Mysql - Fatal编程技术网

Php 清理整数数据库输入

Php 清理整数数据库输入,php,mysql,Php,Mysql,我有一个通过POST请求获取数据的应用程序。我正在使用此数据向数据库中插入新行。我知道使用mysql\u real\u escape\u string()(加上删除%和)是处理字符串的方法,但是整数值呢?现在,我正在对它们使用PHP函数intval() 但是,我想确保intval()是完全安全的。当变量首先通过intval()运行时,我看不到攻击者执行SQL注入攻击的方式(因为它总是返回一个整数),但我想确保经验比我丰富的人会这样做 谢谢。是的,intval()是安全的。当参数转换为整数时,绝对

我有一个通过POST请求获取数据的应用程序。我正在使用此数据向数据库中插入新行。我知道使用
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,为什么不返回呢?