如何防止 php sql 注入攻击?我认为最重要的一点,就是要对数据类型进行检查和转义。总结的几点规则如下:
1. php.ini 中的 display_errors 选项,应该设为 display_errors = off。这样 php 脚本出错之后,不会在 web 页面输出错误,以免让攻击者分析出有作的信息。
2. 调用 mysql_query 等 mysql 函数时,前面应该加上 @,即 @mysql_query(...),这样 mysql 错误不会被输出。同理以免让攻击者分析出有用的信息。另外,有些程序员在做开发时,当 mysql_query出错时,习惯输出错误以及 sql 语句,例如:
这种做法是相当危险和愚蠢的。如果一定要这么做,最好在网站的配置文件中,设一个全局变量或定义一个宏,设一下 debug 标志:
<?php
//全局配置文件中:
define("DEBUG_MODE", 0); // 1: DEBUG MODE; 0: RELEASE MODE
//调用脚本中:
$t_strSQL = "SELECT a from b....";
if (mysql_query($t_strSQL)) {
// 正确的处理
} else {
if (DEBUG_MODE) {
echo "错误! SQL 语句:$t_strSQL错误信息" . mysql_query();
}
exit;
}
?>
3. 对提交的 sql 语句,进行转义和类型检查,确保传入的参数为安全参数。
一般用addslashes() 函数:在指定的预定义字符前添加反斜杠。
这些预定义字符是:
- 单引号 (')
- 双引号 (")
- 反斜杠 (\)
- NULL
当php 配置文件 php.ini 中的 magic_quotes_gpc选项magic_quotes_gpc = On时,它会将提交的变量中所有的 '(单引号)、"(双号号)、(反斜线)、空白字符,都会在前面自动加上过滤掉,相当于用了 addslashes() 函数。
如:
对于非数字型参数:
if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST[‘lastname’]);
} else {
$lastname = $_POST[‘lastname’];
}
还有 可过滤字符串:
$str="zhang; or 1=1#";
$str=str_replace("#", "",$str);//去掉字符串中的‘#’
$str=str_replace(";", "",$str);//去掉字符串中的‘;’
trim 去除一个字符串两端空格,
rtrim 是去除一个字符串右部空格,
ltrim 是去除一个字符串左部空格