防SQL注入PHP过滤html字符串详解

  作者:bea

我们在编程的时候很多时候都考虑到了与用户的交互性,如用户取得良好交互的途径就是用户反馈信息。那么用户就要像你的网站等提交他们的意见或者是看法等。那么怎样来过滤用户的反馈信息就变得非常重要了。因为我们要考虑可能存在恶意的用户SQL注入。 这里我们来使用PHP过滤掉用户输入的HTML代码。实践写代码前我们先来了解一个PHP函数。get_magic_quotes_gpc() 该PHP函数返回的是一个布尔值。是取得当前magic_quotes_gpc 的设定值。0表示关闭,1表示开
我们在编程的时候很多时候都考虑到了与用户的交互性,如用户取得良好交互的途径就是用户反馈信息。那么用户就要像你的网站等提交他们的意见或者是看法等。那么怎样来过滤用户的反馈信息就变得非常重要了。因为我们要考虑可能存在恶意的用户SQL注入。

这里我们来使用PHP过滤掉用户输入的HTML代码。实践写代码前我们先来了解一个PHP函数。get_magic_quotes_gpc() 该PHP函数返回的是一个布尔值。是取得当前magic_quotes_gpc 的设定值。0表示关闭,1表示开启。先来详细了解下这个PHP函数。

在php的配置文件中,有个布尔值的设置,就是magic_quotes_runtime,当它打开时,php的大部分函数自动的给从外部引入的(包括数据库或者文件)数据中的溢出字符加上反斜线。 当然如果重复给溢出字符加反斜线,那么字符串中就会有多个反斜线,所以这时就要用set_magic_quotes_runtime()与get_magic_quotes_runtime()设置和检测php.ini文件中magic_quotes_runtime状态。 为了使自己的程序不管服务器是什么设置都能正常执行。可以在程序开始用get_magic_quotes_runtime检测该设置的状态决定是否要手工处理,或者在开始(或不需要自动转义的时候)用set_magic_quotes_runtime(0)关掉该设置。 magic_quotes_gpc设置是否自动为GPC(get,post,cookie)传来的数据中的\'\"\\加上反斜线。可以用get_magic_quotes_gpc()检测系统设置。如果没有打开这项设置,可以使用addslashes()函数添加,它的功能就是给数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(\')、双引号(\")、反斜线(\\)与 NUL(NULL 字符)。

一般用法如下;
if(!get_magic_quotes_gpc())
{
addslashes($prot);
}

了解了get_magic_quotes_gpc() 这个函数后我们再来正式编写我们的PHP过滤html字符串代码。代码如下:

//php 批量过滤post,get敏感数据
if (get_magic_quotes_gpc()) {
$_GET = stripslashes_array($_GET);
$_POST = stripslashes_array($_POST);
}

function stripslashes_array(&$array) {
while(list($key,$var) = each($array)) {
if ($key != 'argc' && $key != 'argv' && (strtoupper($key) != $key || ''.intval($key) == "$key")) {
if (is_string($var)) {
$array[$key] = stripslashes($var);
}
if (is_array($var)) {
$array[$key] = stripslashes_array($var);
}
}
}
return $array;
}
//--------------------------

// 替换HTML尾标签,为过滤服务
//--------------------------
function lib_replace_end_tag($str)
{
if (empty($str)) return false;
$str = htmlspecialchars($str);
$str = str_replace( '/', "", $str);
$str = str_replace("\\", "", $str);
$str = str_replace("&gt", "", $str);
$str = str_replace("&lt", "", $str);
$str = str_replace("", "", $str);
$str = str_replace("", "", $str);
$str = str_replace("", "", $str);
$str = str_replace("", "", $str);
$str=str_replace("select","select",$str);
$str=str_replace("join","join",$str);
$str=str_replace("union","union",$str);
$str=str_replace("where","where",$str);
$str=str_replace("insert","insert",$str);
$str=str_replace("delete","delete",$str);
$str=str_replace("update","update",$str);
$str=str_replace("like","like",$str);
$str=str_replace("drop","drop",$str);
$str=str_replace("create","create",$str);
$str=str_replace("modify","modify",$str);
$str=str_replace("rename","rename",$str);
$str=str_replace("alter","alter",$str);
$str=str_replace("cas","cast",$str);
$str=str_replace("&","&",$str);
$str=str_replace(">",">",$str);
$str=str_replace("

return $str;

}

上面PHP代码判断了用户提交的数据是以get方式和post方式。考虑很全面了。再来看怎么用上面的代码那就很简单啦!简单写下

引用是直接这样:
$username = htmlspecialchars($_POST['username']);
或者
$username = htmlspecialchars($_GET['username']);

呵呵,上面的这个PHP代码考虑非常全面,大家可以在项目的过程中单独放在一个文件里,在用的页面内加载过来就OK啦!

有用  |  无用

猜你喜欢