php 防止sql注入的方法和步骤
要防止sql注入,最主要的就是对用户输入的数据类型进行检查和对数据进行转义,向 MYSQL 提交正确的数据,这是防止sql注入的根本。
2、严格的数据类型验证
如果明确知道参数应该为数字或数字字符串,那么一定要用is_numeric()验证,intval()强制类型转换。
如果参数为字符串,那么根据实际需要检查是否存在有危害的字符:
3、给sql语句中包含的变量加引号
所以在获取到用户提交的数据后,应该进行如下操作:
1、利用addslashes() 函数将 单引号 (")、双引号 (")、反斜杠 ()、NULL等字符添加反斜杠进行转义。
if(get_magic_quotes_gpc()){ $str = $_GET["name"]; }else{ $str = addslashes($_GET["name"]); //要转义的参数一定为字符串,如果为数组那需要循环把数组里面的每一项都进行转义 } 或者 if(!get_magic_quotes_gpc()){ //php.ini中没有打开magic_quotes_gpc设置 $_GET = addslashes($_GET); $_POST = addslashes($_POST); $_REQUEST = addslashes($_REQUEST); }
2、严格的数据类型验证
如果明确知道参数应该为数字或数字字符串,那么一定要用is_numeric()验证,intval()强制类型转换。
如果参数为字符串,那么根据实际需要检查是否存在有危害的字符:
if (eregi("select|insert|update|delete|"|/*|*|../|./|union|into|load_file|outfile", $str)){ exit("参数不合法"); }
3、给sql语句中包含的变量加引号
$sql = "select * from user where uid = "$uid"";
$sql = "select * from user where uid = $uid";
如果传过来的$uid为 1; delete from article 那么我们上面的两个sql就变为:
$sql = "select * from user where uid = "1; delete from user"";
$sql = "select * from user where uid = 1; delete from user";
很显然第二个sql,执行了两条语句,user表被清空.
两种写法在各种程序中都很普遍,但安全性是不同的,第一句由于把变量$uid放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正确的SQL语句,也不会正常执行,而第二句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格或分号,那空格后的内容都会作为SQL语句执行,因此,我们要养成给SQL语句中变量加引号的习惯.
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇: php 变量赋值、引用以及垃圾回收
- 下一篇:没有了