本人新手,在《PHP安全编码》中提到“不要直接使用$_GET”,同时又提到“可以尝试在php.ini中开启magic_quotes_gpc,这样对于所有由用户GET、POST、COOKIE中传入的特殊字符都会转义”,我很纠结,是否开启magic_quotes_gpc就可以直接使用$_GET?
如下面例子中的代码本人感觉很不安全,因为没有做验证,但又不知道如何改进,希望大神能帮忙,谢谢。
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
1. 像用户名这种有格式的东西,应该取到之后马上用正则表达式验证,比如
preg_match('/\A\w{6,14}\z/', $user)就验证了它是不是6~14位的数字字母下划线。不要使用系统自带的filter,那个管不了什么用。2. 不要使用
mysql开头的函数,要使用mysqli,而且最好进行参数化查询而不是addslashes,后者会有编码问题。3. 输出html的时候,默认使用
htmlspecialchars,这个函数可以指定编码。或者你可以用现成的模板引擎。4. 比较字符串的时候,强制使用
strcmp,不要使用双等号。5. 不要使用
$_REQUEST。这样可以防掉95%。至于
magic_quotes_gpc,应该早就废了吧。现在市面上这些书真的害人不浅,随便下结论或者是楼主没有仔细读。为什么直接使用 $_GET $_POST 不安全?
看了楼主的例子,应该是直接将$_GET 用在拼接SQL上,这样肯定是不安全的,所以核心信息应该是:直接将 $_GET/$_POST等用户输入的内容用于SQL拼接是不安全的,如何避免?
例如:
如果用户提交的username 为
那么就会变成这样:
那么会返回所有的用户记录。当然这里只是粗暴的举了一个例子。实际上要做XSS要熟知代码或者猜测到运行的逻辑等了解很多东西。
最简单的过滤方法是使用 mysql_real_escape_string 函数
至于 magic_quotes,是php最失败的一个改进,现已废弃,就算是低版本的PHP也一定要关闭它。
如果 $_GET
首先判断是否为空
然后对值进行判断
举个例子:
只接受数字 那就使用 php自带函数 is_numeric
一般 GET 也只是传递某个标识
总之在数据库或其他操作之前 先验证 传过来的变量 是否为自己预期的值
可以先对post或者get请求过滤,php有内置函数进行过滤,然后在使用
同意二楼的要有一个过滤,不过只是系统自带的肯定不行,最好自己再根据情况做一个过滤等之类的处理。
我来回答个无关的:
Are PDO prepared statements sufficient to prevent SQL injection?
PDO是否可以防住SQL注入。
建议你先看看
joomla-framework的input类库,地址在这里
或者先把joomla-framework的input类库在你的代码中使用(前期就不要考虑性能之类的问题),先搞明白对于$_GET(包括$_POST、$_FILES、$_COOKIE等)要进行怎样的处理,然后在以后的使用过程中自己选择是否实现简单版本。
为什么这么普遍的问题,php不能做一个统一的控制呢 :(
为什么不用PDO?
防止注入的话PDO就可以了,防止XSS的话建议使用安全厂商提供的一些XSS过滤脚本在输出时过滤.