我正在开发一个供内部使用的简单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'";
答案 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构建规则必须是显式且无条件的。 让开发人员永远不要问自己这样的问题
事实上,完全不同的是:数据验证和查询构建。为什么要记住这些细节并相应地构建查询?为什么不基于一些通用规则构建查询,与数据本质无关?
那么,再次回答你的问题: