防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, """", """, 1, -1, 1)
Str = Replace(Str,"<","<", 1, -1, 1)
Str = Replace(Str,">",">", 1, -1, 1)
Str = Replace(Str, "script", "script", 1, -1, 0)
Str = Replace(Str, "SCRIPT", "SCRIPT", 1, -1, 0)
Str = Replace(Str, "Script", "Script", 1, -1, 0)
Str = Replace(Str, "script", "Script", 1, -1, 1)
Str = Replace(Str, "object", "object", 1, -1, 0)
Str = Replace(Str, "OBJECT", "OBJECT", 1, -1, 0)
Str = Replace(Str, "Object", "Object", 1, -1, 0)
Str = Replace(Str, "object", "Object", 1, -1, 1)
Str = Replace(Str, "applet", "applet", 1, -1, 0)
Str = Replace(Str, "APPLET", "APPLET", 1, -1, 0)
Str = Replace(Str, "Applet", "Applet", 1, -1, 0)
Str = Replace(Str, "applet", "Applet", 1, -1, 1)
Str = Replace(Str, "[", "[")
Str = Replace(Str, "]", "]")
Str = Replace(Str, """", "", 1, -1, 1)
Str = Replace(Str, "=", "=", 1, -1, 1)
Str = Replace(Str, "'", "''", 1, -1, 1)
Str = Replace(Str, "select", "select", 1, -1, 1)
Str = Replace(Str, "execute", "execute", 1, -1, 1)
Str = Replace(Str, "exec", "exec", 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", "count", 1, -1, 1)
Str = Replace(Str, "chr", "chr", 1, -1, 1)
Str = Replace(Str, "mid", "mid", 1, -1, 1)
Str = Replace(Str, "truncate", "truncate", 1, -1, 1)
Str = Replace(Str, "nchar", "nchar", 1, -1, 1)
Str = Replace(Str, "char", "char", 1, -1, 1)
Str = Replace(Str, "alter", "alter", 1, -1, 1)
Str = Replace(Str, "cast", "cast", 1, -1, 1)
Str = Replace(Str, "exists", "exists", 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。
受用, 感谢.
可是我已经有好几次直接关闭了,应该怎么办呢?之前登录的用户还在
小站http://kkk.sjhcx.com/的SEO布局不知如何,请博主有空指点
来访既是有缘。。留下足迹再走
不错,感人,给力
不错也~~~~
就是,就是,现在的电影就看票房,完全没社会责任心
其实对于这个问题,我们应该淡定,平常心,平常心。
写的不错, 兔年快乐喽!!
哇,春节快乐, 这几天玩过头了
Powered by Bitrac, Designed by Loveyuki, Icon by Led Icon Set. 京ICP备07032740号-2