Maison > Questions et réponses > le corps du texte
本人新手,在《PHP安全编码》中提到“不要直接使用$_GET”,同时又提到“可以尝试在php.ini中开启magic_quotes_gpc,这样对于所有由用户GET、POST、COOKIE中传入的特殊字符都会转义”,我很纠结,是否开启magic_quotes_gpc就可以直接使用$_GET?
如下面例子中的代码本人感觉很不安全,因为没有做验证,但又不知道如何改进,希望大神能帮忙,谢谢。
<?php
$name = $_GET["name"];
$user = $_GET["user"];
mysql_query("SELECT $name FROM $user");
PHP中文网2017-04-10 15:51:52
什么是$_GET? $_GET是一类通过 URL 参数传递给当前脚本的变量的数组。而$HTTP_GET_VARS 包含相同的信息, 但它不是一个超全局变量。 (注意 $HTTP_GET_VARS 和 $_GET 是不同的变量,PHP 处理它们的方式不同).
那么$_GET()的安全考虑主要是在获取值的时候进行的安全考虑的,在进行数据的过滤时防止XSS攻击,PDO攻击中的SQL注入等安全问题,这些都是通过$_GET()传递值来威胁到系统安全的,还有敏感数据最好进行加密处理,不要太过于明显的暴露,以防被劫持利用等危险。
那么一些简单的数据过滤的方式有:
对于XXS攻击(跨站脚本攻击)都是由于对用户的输入没有进行严格的过滤造成的,所以我们必须在所有数据进入我们的网站和数据库之前把可能的危险拦截。针对非法的HTML代码包括单双引号等,可以使用htmlentities()来进行数据过滤。 但是要注意一点,htmlentities()默认编码为 ISO-8859-1,如果你的非法脚本编码为其它,那么可能无法过滤掉,同时浏览器却可以识别和执行。
对于PDO攻击中的SQL注入,在php编写程序中,我们可以使用类似如下的PDO预处理绑定语句来有效的防止sql注入问题:
$stmt = $dbh -> prepare ( "INSERT INTO REGISTRY (name, value) VALUES (:name, :value)" );
$stmt -> bindParam ( ':name' , $name );
$stmt -> bindParam ( ':value' , $value );
$name = 'one' ;
$value = 1 ;
$stmt -> execute ();
或者使用?号占位符来达到相同的效果:
$stmt = $dbh -> prepare ( "INSERT INTO REGISTRY (name, value) VALUES (?, ?)" );