网站源码多以ASP,asp.net,PHP等为主,这里讲一下如何防范ASP网站中木马的问题.
目前网站被入侵主要表现形式:
1、网站内容被篡改/或者删除
2、网站被插入恶意代码,一般是在网页头部或者底部插入<iframe ...></iframe>之类的框架
3、网站数据库被下载
以上出现的基本原因:网站存在安全漏洞,基本入侵的方法和对应解决方法如下:
一、ASP防注入
一般的http请求不外乎get和post,所以只要我们在文件中过滤所有post或者get请求中的参数信息
中 非法字符即可,所以我们实现http请求信息过滤就可以判断是是否受到sql注入攻击。
IS传递给asp.dll的get请求是是以字符串的形式,当传递给Request.QueryString数据后, asp解
析器会分析Request.QueryString的信息,然后根据"&",分出各个数组内的数据所以get的拦截如下:
首先我们定义请求中不能包含如下字符
'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char| declare
|xp_cmdshell 注意:各个字符用"|"隔开,
然后我们判断的得到的Request.QueryString
具体程序代码:
Dim sql_injdata
SQL_injdata = "|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char
|declare|xp_cmdshell"
SQL_inj = split(SQL_Injdata,"|")
If Request.QueryString<>"" Then
For Each SQL_Get In Request.QueryString
For SQL_Data=0 To Ubound(SQL_inj)
If InStr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0 Then
Response.Write("")
Response.End()
End If
Next
Next
End If
这样我们就实现了get请求的注入的拦截,但是我们还要过滤post请求,所以我们还得继续考虑
request.form,这个也是以数组形式存在的,,我们只需要再进一次循环判断即可。代码如下
具体程序代码:
If Request.Form<>"" Then
For Each SQL_Get In Request.Form
For SQL_Data=0 To Ubound(SQL_inj)
If InStr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0 Then
Response.Write("")
Response.End()
End If
Next
Next
End If
现在已经实现了get和post请求的信息拦截,只需要在conn.asp之类的打开数据库文件之前引
用这个页面即可。
具体实例:
Option Explicit
'SQL注入拦截开始
Dim SQL_injdata, SQL_inj, SQL_Get, SQL_Data
SQL_injdata = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char
|declare"
SQL_inj = Split(SQL_Injdata,"|")
If Request.QueryString<>"" Then Call KillSQLinj(Request.QueryString)'//get方式拦截
If Request.Form<>"" Then Call KillSQLinj(Request.Form)'//post方式拦截
Sub KillSQLinj(fashion)
For Each SQL_Get In fashion
For SQL_Data=0 To Ubound(SQL_inj)
If InStr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0 Then
Response.Write("")
Response.End()
End If
Next
Next
End Sub
'//SQL注入拦截结束
二、PHP防注入
相应于ASP,PHP也存在不少漏洞,请将下列代码保存为JotopCheck.php
然后在每个php文件前加include(“JotopCheck.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\"";
echo ">window.location=\"".$StrGoUrl."\";</script>";
}
exit;
}
}
?>
三、ACCESS数据库安全防范
ACCESS数据库防下载要点有以下二点:
1. 改名
ACCESS数据库的默认后缀名是.mdb,这种结尾的文件在WEB浏览时是可以直接进行下载的,建议
将后缀改为.asp或者.asa,这样就不会被直接下载过去了,当然,改名后不会影响到你的连接,
这种文件名结尾的ACCESS数据库还是可以通过程序控制访问的。
建议将文件名中添加上#,例如test.mdb,将它改名为:#test#.mdb,在浏览器中,#后面的数据
都不会被执行,这样即使别人知道您的数据库确切路径也无法进行下载了。
2. 放置文件夹
建议将数据库放置到我司虚拟主机提供的databases文件夹中,因为此文件夹不在默认的文件夹
中,这样对您的数据库的安全有了更高的保证。您自己访问数据库的话可以通过相对路径进行连
接,下面的实例给您参考:
结构:
wwwroot
|- conn.asp
Databases
|- #test#.asa
程序:
Conn.asp
<%
dim conn,db,connstr
db="../Databases/#test#.asa" '数据库文件位置
connstr="DBQ="+server.mappath(""&db&"")+";DefaultDir=;DRIVER={Microsoft Access Driver
(*.mdb)};"
set conn=server.createobject("ADODB.CONNECTION")
'//程序结束
%>
四、其它
还有一些其它要注意的方面,如使用不是自己编写的论坛,要定其到官方看看是否有什么新的漏
洞补丁之类,最好及时升级至最新版本。
Asp.net、Jsp等等语言都有其相应的漏洞,这里就不一一列举出来。
有不明白的地方,可与我们联系,电话:0755-27965379
|