之前用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;
}
?>