php 防注入


之前用php做网站, php很方便好用,很好网站就做好了。可是听说还要做防注入(当时不知所云)。马上上网补一下。(其实很简单了,只要你有这个意识)

先说什么是注入:
        因为代码没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果, 获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
SQL注入攻击的总体思路是:

l 发现SQL注入位置;
l 判断后台数据库类型;
l 确定XP_CMDSHELL可执行情况
l 发现WEB虚拟目录
l 上传ASP木马;
l 得到管理员权限;

知道了就要动手防它了:
  因为我们的获取的变量一般都是通过GET或者POST方式提交过来的,那么我们只要对GET和POST过来的变量进行过滤,那么就能够达到防止注入的效果。而且我们的PHP真是非常好,已经内置了$_GET和$_POST两个数组来存储所有变量, 我们要做的工作就是过滤每个变量就可以了。

只要编写检验变量合法性的函数, 存在一个公共文件里,如security.php。其他文件只要include一下这个文件,那么就能够给任何一个程序进行提交的所有变量进行过滤了, 一劳永逸了。

这就是我用的方法
具体的代码:
<?php
    //security.php
/**
  * @author zhengwei
  * @copyright 2007
  */

/* 
函数名称:inject_check() 
函数作用:检测提交的值是不是含有SQL注射的字符,防止注射,保护服务器安全 
参  数:$sql_str: 提交的变量 
返 回 值:返回检测结果,ture or false 
函数作者:heiyeluren 
*/ 
function inject_check($sql_str) {   
  return eregi('select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile', $sql_str);      // 进行过滤   
}   
 
/* 
函数名称:verify_id() 
函数作用:校验提交的ID类值是否合法 
参  数:$id: 提交的ID值 
返 回 值:返回处理后的ID 
函数作者:heiyeluren 
*/ 
function verify_id($id=null) {   
  if (!$id) { exit('没有提交参数!'); }      // 是否为空判断   
  elseif (inject_check($id)) { exit('提交的参数非法!'); }      // 注射判断   
  elseif (!is_numeric($id)) { exit('提交的参数非法!'); }      // 数字判断   
  $id = intval($id);      // 整型化   
 
  return  $id;   
}   
 
/* 
函数名称:str_check() 
函数作用:对提交的字符串进行过滤 
参  数:$var: 要处理的字符串 
返 回 值:返回过滤后的字符串 
函数作者:heiyeluren 
*/ 
function str_check( $str ) {   
  if (!get_magic_quotes_gpc()) {      // 判断magic_quotes_gpc是否打开   
      $str = addslashes($str);      // 进行过滤   
  }   
  $str = str_replace("_", "\_", $str);      // 把 '_'过滤掉   
  $str = str_replace("%", "\%", $str);      // 把 '%'过滤掉   
 
  return $str;     
}   
 
/* 
函数名称:post_check() 
函数作用:对提交的编辑内容进行处理 
参  数:$post: 要提交的内容 
返 回 值:$post: 返回过滤后的内容 
函数作者:heiyeluren 
*/ 
function post_check($post) {   
  if (!get_magic_quotes_gpc()) {      // 判断magic_quotes_gpc是否为打开   
      $post = addslashes($post);      // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤   
  }   
  $post = str_replace("_", "\_", $post);      // 把 '_'过滤掉   
  $post = str_replace("%", "\%", $post);      // 把 '%'过滤掉   
  $post = nl2br($post);      // 回车转换   
  $post = htmlspecialchars($post);      // html标记转换   
 
  return $post;   
}   


foreach ($_POST as $post_key=>$post_var)
{
  if (is_numeric($post_var)) {
  $post[strtolower($post_key)] = get_int($post_var);
  } else {
  $post[strtolower($post_key)] = get_str($post_var);
  }
}

/* 过滤函数 */
//整型过滤函数
function get_int($number)
{
      return intval($number);
}
//字符串型过滤函数
function get_str($string)
{
      if (!get_magic_quotes_gpc()) {
  return addslashes($string);
      }
      return $string;
}

?> 

你可能感兴趣的:(php 防注入)