防SQL注入字符过滤 WEB 服务器内容过滤参考

通过 VisNetic Firewall 之类的具有内容过滤和 IDS 功能的防火墙,可以对
用户端提交的请求进行内容过滤,能够极大地提高站点防范注入和溢出等的危险。
以下内容仅供参考,禁用了这些字符串后,相信很难有什么注入的作为了!请注意前后空格!

and
and 1=1
and 1=2
and 0
<>
select
count(*)
from
declare
@a
set
'xp_'
'cmdshell'
exec

dir
c:\
winnt\system32
windows\system32
cmd.exe
cmdshell
onerror=
'
--
"
\
$
NULL
? = &
'or''='
"''"
"''''"
SELECT
FROM
WHERE
Count(*)
net user
/add
exec%20
xp_cmdshell
insert
delete
drop
truncate
../
.../
XXXXX
xxxxx
%5c

 

防止SQL注入的字符过滤方法
时间:2006-03-06 

对于SQL注入最直接有效的方法就是将网站系统代码进行修改,过滤掉一些与注入有关的非法字符,发现客户端提交的参数中有"exec、insert、select、delete、from、update、count、user、xp_cmdshell、add、net、Asc"等用于SQL注入的常用字符时,立即停止执行ASP并给出警告信息或转向出错页面。

通常判断网站是否存在SQL注入漏洞,可以通过下面3种方法。

1.数字型 "select * from table_name where field_name=1"

1 and 1=1显示正常

1 and 1=2 数据找不到或报错。


2.字符型 "select * from table_name where field_name='a'"

a' and 1=1--显示正常

a' and 1=0--找不到或报错。


3.搜索型 "select * from table_name where field_name like'%a%'"

a%' and 1=1-- 显示正常

a%' and 1=2-- 找不到或报错。

从上面看出如果在编程的过程中对返回的值不做检查就加以使用,必然导致SQL注入问题。第1个例子,参数是数字型,调用函数IsNumberic判断返回参数是否数字型。对于第2,3个例子,返回的参数是字符串型。通常将”’”替换成两个单引号或是其他字符串,这种方法对char()函数就无能为力。因此,在过滤单引号的同时还需将一些查询的关键字过滤掉。


下面给出一段防范SQL注入的代码,仅供参考。

uti_si.asp

<%

Dim PagePost,PageGet,SIStr,TempStr,FilterStr

'自定义需要过滤的字串,用 "|" 分隔

FilterStr = "'|;|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"

SIStr = split(FilterStr,"|")

'POST部分

If Request.Form<>"" Then

For Each PagePost In Request.Form

For TempStr=0 To Ubound(SIStr)

If Instr(LCase(Request.Form(PagePost)),SIStr(TempStr))<>0 Then

Response.Write "<Script Language=JavaScript>alert('请不要在参数中包含非法字符尝试注入!');history.back(-1)</Script>"

Response.End

End If

Next

Next

End If

'GET部分

If Request.QueryString<>"" Then

For Each PageGet In Request.QueryString

For TempStr=0 To Ubound(SIStr)

If Instr(LCase(Request.QueryString(PageGet)),SIStr(TempStr))<>0 Then

Response.Write "<Script Language=JavaScript>alert('请不要在参数中包含非法字符尝试注入!');history.back(-1)</Script>"

Response.End

End If

Next

Next

End If

%>

将unti_si.asp放到网站中include到需要过滤的网页中。


另外网页查询Sql Server的权限应当加以控制,如果是sysadmin或是db_owner的权限,攻击者一旦发现了SQL注入漏洞后果就比较严重了。http://dev.csdn.net/article/61/61969.shtm,这篇文章对Sql Server讲的比较详细,就不多说了。

还有一个ASP最新的防SQL注入过滤函数,可供参考。

文摘出处:http://www.meiqin.com/blogview.asp?logID=17

Function Checkstr(Str)
If Isnull(Str) Then
CheckStr = ""
Exit Function
End If
Str = Replace(Str,Chr(0),"", 1, -1, 1)
Str = Replace(Str, """", "&quot;", 1, -1, 1)
Str = Replace(Str,"<","&lt;", 1, -1, 1)
Str = Replace(Str,">","&gt;", 1, -1, 1)
Str = Replace(Str, "script", "&#115;cript", 1, -1, 0)
Str = Replace(Str, "SCRIPT", "&#083;CRIPT", 1, -1, 0)
Str = Replace(Str, "Script", "&#083;cript", 1, -1, 0)
Str = Replace(Str, "script", "&#083;cript", 1, -1, 1)
Str = Replace(Str, "object", "&#111;bject", 1, -1, 0)
Str = Replace(Str, "OBJECT", "&#079;BJECT", 1, -1, 0)
Str = Replace(Str, "Object", "&#079;bject", 1, -1, 0)
Str = Replace(Str, "object", "&#079;bject", 1, -1, 1)
Str = Replace(Str, "applet", "&#097;pplet", 1, -1, 0)
Str = Replace(Str, "APPLET", "&#065;PPLET", 1, -1, 0)
Str = Replace(Str, "Applet", "&#065;pplet", 1, -1, 0)
Str = Replace(Str, "applet", "&#065;pplet", 1, -1, 1)
Str = Replace(Str, "[", "&#091;")
Str = Replace(Str, "]", "&#093;")
Str = Replace(Str, """", "", 1, -1, 1)
Str = Replace(Str, "=", "&#061;", 1, -1, 1)
Str = Replace(Str, "'", "''", 1, -1, 1)
Str = Replace(Str, "select", "select", 1, -1, 1)
Str = Replace(Str, "execute", "&#101xecute", 1, -1, 1)
Str = Replace(Str, "exec", "&#101xec", 1, -1, 1)
Str = Replace(Str, "join", "join", 1, -1, 1)
Str = Replace(Str, "union", "union", 1, -1, 1)
Str = Replace(Str, "where", "where", 1, -1, 1)
Str = Replace(Str, "insert", "insert", 1, -1, 1)
Str = Replace(Str, "delete", "delete", 1, -1, 1)
Str = Replace(Str, "update", "update", 1, -1, 1)
Str = Replace(Str, "like", "like", 1, -1, 1)
Str = Replace(Str, "drop", "drop", 1, -1, 1)
Str = Replace(Str, "create", "create", 1, -1, 1)
Str = Replace(Str, "rename", "rename", 1, -1, 1)
Str = Replace(Str, "count", "co&#117;nt", 1, -1, 1)
Str = Replace(Str, "chr", "c&#104;r", 1, -1, 1)
Str = Replace(Str, "mid", "m&#105;d", 1, -1, 1)
Str = Replace(Str, "truncate", "trunc&#097;te", 1, -1, 1)
Str = Replace(Str, "nchar", "nch&#097;r", 1, -1, 1)
Str = Replace(Str, "char", "ch&#097;r", 1, -1, 1)
Str = Replace(Str, "alter", "alter", 1, -1, 1)
Str = Replace(Str, "cast", "cast", 1, -1, 1)
Str = Replace(Str, "exists", "e&#120;ists", 1, -1, 1)
Str = Replace(Str,Chr(13),"<br>", 1, -1, 1)
CheckStr = Replace(Str,"'","''", 1, -1, 1)
End Function

 


PHP:

/*************************

说明:

判断传递的变量中是否含有非法字符

如$_POST、$_GET

功能:

防注入

在每个php文件前加include(sql.php“);即可
**************************/

<?php

//要过滤的非法字符

$ArrFiltrate=array("'",";","union");

//出错后要跳转的url,不填则默认前一页

$StrGoUrl="";

//是否存在数组中的值

function FunStringExist($StrFiltrate,$ArrFiltrate){

foreach ($ArrFiltrate as $key=>$value){

if (eregi($value,$StrFiltrate)){

return true;

}

}

return false;

}

//合并$_POST 和 $_GET

if(function_exists(array_merge)){

$ArrPostAndGet=array_merge($HTTP_POST_VARS,$HTTP_GET_VARS);

}else{

foreach($HTTP_POST_VARS as $key=>$value){

$ArrPostAndGet[]=$value;

}

foreach($HTTP_GET_VARS as $key=>$value){

$ArrPostAndGet[]=$value;

}

}

//验证开始

foreach($ArrPostAndGet as $key=>$value){

if (FunStringExist($value,$ArrFiltrate)){

echo "<script language=\"javascript\">alert(\"Neeao提示,非法字符\");</script>";

if (empty($StrGoUrl)){

echo "<script language=\"javascript\">history.go(-1);</script>";

}else{

echo "<script language=\"javascript\">window.location=\"".$StrGoUrl."\";</script>";

}

exit;

}

}

?>


 

php 防注入
出处

<?php
/*************************
说明:
判断传递的变量中是否含有非法字符
如$_POST、$_GET
功能:
防注入
**************************/

//要过滤的非法字符
$ArrFiltrate=array("'",";","union");
//出错后要跳转的url,不填则默认前一页
$StrGoUrl="";
//是否存在数组中的值
function FunStringExist($StrFiltrate,$ArrFiltrate){
foreach ($ArrFiltrate as $key=>$value){
if (eregi($value,$StrFiltrate)){
return true;
}
}
return false;
}

//合并$_POST 和 $_GET
if(function_exists(array_merge)){
$ArrPostAndGet=array_merge($HTTP_POST_VARS,$HTTP_GET_VARS);
}else{
foreach($HTTP_POST_VARS as $key=>$value){
$ArrPostAndGet[]=$value;
}
foreach($HTTP_GET_VARS as $key=>$value){
$ArrPostAndGet[]=$value;
}
}

//验证开始
foreach($ArrPostAndGet as $key=>$value){
if (FunStringExist($value,$ArrFiltrate)){
echo "<script language=\"javascript\">alert(\"非法字符\");</script>";
if (empty($StrGoUrl)){
echo "<script language=\"javascript\">history.go(-1);</script>";
}else{
echo "<script language=\"javascript\">window.location=\"".$StrGoUrl."\";</script>";
}
exit;
}
}
?>

保存为checkpostandget.php
然后在每个php文件前加include(“checkpostandget.php“);即可


PHP防注入安全代码 [转贴 2006-01-19 12:45:26 | 发表者: ibar]

简述:/*************************
说明:
判断传递的变量中是否含有非法字符
如$_POST、$_GET
功能:防注入
**************************/

<?php

//要过滤的非法字符
$ArrFiltrate=array("'",";","union");
//出错后要跳转的url,不填则默认前一页
$StrGoUrl="";
//是否存在数组中的值
function FunStringExist($StrFiltrate,$ArrFiltrate){
foreach ($ArrFiltrate as $key=>$value){
if (eregi($value,$StrFiltrate)){
return true;
}
}
return false;
}

//合并$_POST 和 $_GET
if(function_exists(array_merge)){
$ArrPostAndGet=array_merge($HTTP_POST_VARS,$HTTP_GET_VARS);
}else{
foreach($HTTP_POST_VARS as $key=>$value){
$ArrPostAndGet[]=$value;
}
foreach($HTTP_GET_VARS as $key=>$value){
$ArrPostAndGet[]=$value;
}
}

//验证开始
foreach($ArrPostAndGet as $key=>$value){
if (FunStringExist($value,$ArrFiltrate)){
echo "<script language=\"javascript\">alert(\"非法字符\");</script>";
if (empty($StrGoUrl)){
echo "<script language=\"javascript\">history.go(-1);</script>";
}else{
echo "<script language=\"javascript\">window.location=\"".$StrGoUrl."\";</script>";
}
exit;
}
}
?>

保存为checkpostandget.php
然后在每个php文件前加include(“checkpostandget.php“);即可

方法2

/* 过滤所有GET过来变量 */
foreach ($_GET as $get_key=>$get_var)
{
if (is_numeric($get_var)) {
$get[strtolower($get_key)] = get_int($get_var);
} else {
$get[strtolower($get_key)] = get_str($get_var);
}
}

/* 过滤所有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;
}


我们把以上代码放到一个公共的文件里,比如security.inc.php里面,每个文件里都include一下这个文件,那么就能够给任何一个程序进行提交的所有变量进行过滤了,就达到了我们一劳永逸的效果。

字符过滤跟据实际需要自定义设置更有意义,比如空格和TAB等,即%20,%09。

本日志由 胡子 于 2008-09-10 10:05:17 发表,目前已经被浏览 4451 次,评论 0 次;

作者添加了以下标签: 防止SQL注入字符过滤WEB服务器内容过滤防范SQL注入代码防注入php

引用通告:http://21pt.com/Article/144/Trackback.ashx

评论订阅:http://21pt.com/Article/144/Feeds.ashx

评论列表

    暂时没有评论
(必填)
(必填,不会被公开)
你的评论在博主审核后方可公开。