防止 PHP的SQL 注入攻击

如何防止 php sql 注入攻击?我认为最重要的一点,就是要对数据类型进行检查和转义。总结的几点规则如下:

1. php.ini 中的 display_errors 选项,应该设为 display_errors = off。这样 php 脚本出错之后,不会在 web 页面输出错误,以免让攻击者分析出有作的信息。

2. 调用 mysql_query 等 mysql 函数时,前面应该加上 @,即 @mysql_query(...),这样 mysql 错误不会被输出。同理以免让攻击者分析出有用的信息。另外,有些程序员在做开发时,当 mysql_query出错时,习惯输出错误以及 sql 语句,例如:


<php
$t_strSQL = "SELECT a from b....";
if (mysql_query($t_strSQL)) {
  // 正确的处理
} else {
  echo "错误! SQL 语句:$t_strSQL
错误信息" . mysql_query();
  exit;
}
?>

这种做法是相当危险和愚蠢的。如果一定要这么做,最好在网站的配置文件中,设一个全局变量或定义一个宏,设一下 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
      还有对于数字型参数用 is_numeric()函数等。

     当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 是去除一个字符串左部空格

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值