验证$ _GET和$ _POST变量的实际名称是否有意义 确定只输入了允许的变量?
例如,假设看到表单线程的php脚本需要这样的字符串:
的index.php主题ID = 5&安培;的OrderBy = lastpost&安培;排序= ASC
它是否添加了更多安全性来验证只有'threadid','orderby'和'sort'可以用作变量名?
例如,某人将& dostuff = true添加到字符串中会出现某种类型的错误 只是想知道这是否有助于以任何方式使脚本更安全。
由于
答案 0 :(得分:2)
只要您没有激活register_globals
,我就没有看到验证字段名称的任何价值。您通常事先知道您需要哪些变量,并相应地验证它们的值。
启用register_globals
(非常气馁)请求中的变量可能会隐藏您自己的未初始化变量。更多相关信息:http://www.php.net/manual/en/security.globals.php
答案 1 :(得分:1)
只要未启用register_globals
,如果$_GET
/ $_POST
中存在不需要的密钥,则不会有继续执行脚本的风险。
答案 2 :(得分:1)
除非你迭代$_GET
,$_POST
等人的内容,否则它将完全没有效果。大多数情况下,您使用带有这些变量的静态密钥,即$_GET['orderby']
而不是$_GET[$orderByKey]
。
但是,即使你曾经迭代过这些值,也应该正确处理这些值。例如,如果您要在HTML文档中输出它们,请使用htmlspecialchars
转义数据,或者将它们用作准备好的事务中的值(而不是直接在您构造的查询字符串中)以用于数据库访问。
答案 3 :(得分:0)
如果某个脚本在互联网上可用,则任何人都可以调用该脚本,并且可以传递该人决定使用的任何变量。仅仅因为你有一个很好的系统设置,只使用了几个变量,黑客会尝试提交许多常见的变量名称(通过GET和POST)来查看它们是否可以破解。
简而言之,ANYTIME需要获取GET或POST变量的值,您需要对其进行过滤和/或消毒。 PHP有一个库(PHP5 +,但PHP4支持在2007年停止,所以它不好用)。如果您需要更高级的功能,例如 Zend Framework Zend_Filter ,那么各种框架中还有其他库。
http://www.w3schools.com/php/php_ref_filter.asp
http://www.php.net/manual/en/book.filter.php
以下是一些可以使用它的方法。上面的列表将显示要使用的所有标志。
获取POST变量,验证它
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
获取POST变量,清理它
$url = filter_input(INPUT_POST, 'url', FILTER_SANITIZE_URL);
如果确实需要,您可以创建自己的过滤功能。
答案 4 :(得分:0)
就谨慎而言:好主意。但我也认为它没有太大的实用价值。
由于典型应用程序无论如何都会忽略未知参数,因此我认为没有安全风险。实际上,我考虑过至少在array_intersect_assoc($_GET, $_POST)
发生时创建日志条目。 (参数应该仅存在于一个中,否则它是一个有点可疑的请求。但是对于另一个应用程序,出于可靠性的原因我完全做了。)
反点:CodeIgniter和/或Kohana完全按照你的建议行事。它们使用预定义的筛选器列表,不允许您访问未配置的输入变量。显然这是一个普遍的想法。