整数的filter_input和mysqli_real_escape_string

时间:2012-03-11 07:04:25

标签: php mysqli mysql-real-escape-string filter-input

我正在开发一个供内部使用的简单PHP数据库应用程序,但希望将其编写为最佳实践。我的一些页面正在接收来自GET请求的整数值,我只是想知道确实需要多少验证和卫生。

目前我正在使用$num = filter_input(INPUT_GET, 'num', FILTER_VALIDATE_INT, $num_options);指定的最小值和最大值。从这里开始,如果$num == false

,我将退出并显示错误消息

是否有必要使用$mysqli->real_escape_string($num);

目前我没有打扰,因为我认为使用整数进行SQL注入非常困难......

谢谢,

凯文

更新:澄清我正在做的查询看起来像这样

$sql = "SELECT employeeID, concat(FirstName, ' ', LastName) as Name FROM employee WHERE employeeID='$num'";

2 个答案:

答案 0 :(得分:4)

我看到你使用mysqli,你最好的安全选择是查看准备好的陈述。

PHP mysqli Prepared Statements

一个例子有点涉及,但上面的链接有深刻的例子 一旦你掌握了它,并建立你的课程。它实际上只是一个普通的SQL查询,而不是包含你使用的值吗?

"SELECT * FROM account WHERE username = ? AND password = ?"

并将值绑定到语句:

array("bradley", "Passw0rd");

作为简短的回答,安全性来自于您不会自己将值连接到查询字符串中。使它不太容易sql注入。

答案 1 :(得分:0)

像许多其他PHP用户一样,你正在逃避错误。你把它当作某种魔杖,使一些“邪恶的角色”“安全” 这是错误的想法 虽然准备好的语句可以作为一种这样的魔杖,但逃避不是“SQL注入保护”的同义词。它只是一个字符串语法规则 - 不多也不少。

  

是否有必要使用$ mysqli-> real_escape_string($ num);

这是无关紧要的问题 要逃避或不逃避决策必须绑定到SQL,而不是绑定到数据源或任何验证:

  • real_escape_string()必须用于 sql strings ,即用引号括起来的部分查询。必须无条件地使用,尽管以前的操作。
  • 对于查询的任何其他部分real_escape_string() 完全没用。

解释:
可以更改数据验证规则 虽然SQL构建规则必须是显式且无条件的。 让开发人员永远不要问自己这样的问题 事实上,完全不同的是:数据验证和查询构建。为什么要记住这些细节并相应地构建查询?为什么不基于一些通用规则构建查询,与数据本质无关?

那么,再次回答你的问题:

  • 如果您按原样将数据添加到查询中,没有引号,在这种情况下,real_escape_string()将完全无用,但是转换/验证变得至关重要。
  • 如果您使用预准备语句将数据添加到查询中,则real_escape_string()将完全无用甚至有害。
  • 如果您使用引号将数据添加到查询中 - 在这种情况下,您应该执行real_escape_string()。
  • 还值得一提的是,如果您将数据作为SQL语言的一部分添加到查询中 - 作为标识符或SQL关键字 - real_escape_string()也是完全无用的,以及准备好的语句。白名单是你唯一的朋友