如果我确定我在动态语句中使用的某个值是整数,那么我是否可以安全地从SQL注入?

时间:2017-07-10 17:45:40

标签: php mysql pdo sql-injection

在我进行查询之前,我使用以下代码检查该查询中要使用的变量是否为整数:filter_var($_POST["user_id"], FILTER_VALIDATE_INT) !== false

我的问题是,如果我的值是一个整数(意味着我用来构建我的查询的值是安全的),如果上面的函数返回true,我应该使用PDO还是进行任何转义?如果我的值已经通过上述测试,是否需要使用预准备语句来转义值?

我没有对上述内容进行过任何测试,也没有真正体验过服务器端技术,因此由PHP /安全专家来指导我。

3 个答案:

答案 0 :(得分:3)

使用准备好的陈述仍然是个好主意。此时的绑定功能都是经过验证的。

  1. 如果您或其他人搞砸过滤器怎么办?

  2. 您是否会记得在代码中的每个位置使用正确的过滤器?这是一个非常容易管理不善的事情,有时你可能无法计划每一个可能性。整数相对容易,但字符串要复杂得多。

  3. 关于您的专业声誉,其他人会看到此代码吗?如果您有开源代码(如github或其他东西),而且我是一名调查您历史的招聘经理,我不会雇用您来打破这样的标准安全实践。

  4. 不可否认,第3点有点偏离主题,但我觉得值得一提。

答案 1 :(得分:2)

  

这个答案是对评论的简写类型转换的解释,因为它更容易将其作为答案而不是作为一组评论来阅读。

您的代码:

filter_var($_POST["user_id"], FILTER_VALIDATE_INT) !== false. 

这是一种确保POSTed数据为整数的冗长方式。它有问题,因为POST数据总是被转换为字符串

 $_POST["user_id"] = (int)$_POST["user_id"]; 

更容易阅读,输入更短,并且强制数据为整数类型。如果将非整数数据放入SQL中的整数位置,这将有效地解决您的安全风险。

这是非常值得一读的PHP Type Juggling

虽然上面的代码将解决您的安全问题,但它会引发其他重叠问题,因为任何字符串都可以转换为整数,但如果字符串不以整数值开头,则转换将返回0。

示例:

$string = "hello";
print (int)$string; // outputs 0;

$string = "27hello";
print (int)$string; // outputs 27;

$string = true;
print (int)$string; // outputs 1;

$string = "";
print (int)$string; // outputs 0;

因此,总的来说,我建议使用以下行来确保您的POST值是正确的整数:

if (strcmp((int)$_POST['value'], $_POST['value']) == 0){
    /// it's ok!
}

请参阅this answer for further details以及this PHP manual page

答案 2 :(得分:1)

在使用FILTER_VALIDATE_INT

之前,您可能需要查看页面this页面的php错误