中文版 | English

网站首页 | 个人作品 | 博客 | 给我留言 | 经典分享 | 友情链接 | 黑白人生


脚本访问源控制篇

这几天看着自己的站点被trackback垃圾影响,觉得对于数据来源控制以防恶意提交,恶意刷机,有效数据等检测很有必要,所以整理了以下内容,大部分来自网络,有些找不到作者就没有添加;里面有部分内容在原作者的基础上有补充,如有侵犯请告之!
必要知识的了解ASP内置对象Request的ServerVariables集合列表
Request.ServerVariables("Url")
返回服务器地址
Request.ServerVariables("Path_Info")
客户端提供的路径信息
Request.ServerVariables("Appl_Physical_Path")
与应用程序元数据库路径相应的物理路径
Request.ServerVariables("Path_Translated")
通过由虚拟至物理的映射后得到的路径
Request.ServerVariables("Script_Name")
执行脚本的名称
Request.ServerVariables("Query_String")
查询字符串内容
Request.ServerVariables("Http_Referer")
请求的字符串内容
Request.ServerVariables("Server_Port")
接受请求的服务器端口号
Request.ServerVariables("Remote_Addr")
发出请求的远程主机的IP地址
Request.ServerVariables("Remote_Host")
发出请求的远程主机名称
Request.ServerVariables("Local_Addr")
返回接受请求的服务器地址
Request.ServerVariables("Http_Host")
返回服务器地址
Request.ServerVariables("Server_Name")
服务器的主机名、DNS地址或IP地址
Request.ServerVariables("Request_Method")
提出请求的方法比如GET、HEAD、POST等等
Request.ServerVariables("Server_Port_Secure")
如果接受请求的服务器端口为安全端口时,则为1,否则为0
Request.ServerVariables("Server_Protocol")
服务器使用的协议的名称和版本
Request.ServerVariables("Server_Software")
应答请求并运行网关的服务器软件的名称和版本
Request.ServerVariables("All_Http")
客户端发送的所有HTTP标头,前缀HTTP_
Request.ServerVariables("All_Raw")
客户端发送的所有HTTP标头,其结果和客户端发送时一样,没有前缀HTTP_
Request.ServerVariables("Appl_MD_Path")
应用程序的元数据库路径
Request.ServerVariables("Content_Length")
客户端发出内容的长度
Request.ServerVariables("Https")
如果请求穿过安全通道(SSL),则返回ON如果请求来自非安全通道,则返回OFF
Request.ServerVariables("Instance_ID")
IIS实例的ID号
Request.ServerVariables("Instance_Meta_Path")
响应请求的IIS实例的元数据库路径
Request.ServerVariables("Http_Accept_Encoding")
返回内容如:gzip,deflate
Request.ServerVariables("Http_Accept_Language")
返回内容如:en-us
Request.ServerVariables("Http_Connection")
返回内容:Keep-Alive
Request.ServerVariables("Http_Cookie")
Request.ServerVariables("Http_User_Agent")
返回内容:Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1)
Request.ServerVariables("Https_Keysize")
安全套接字层连接关键字的位数,如128
Request.ServerVariables("Https_Secretkeysize")
服务器验证私人关键字的位数如1024
Request.ServerVariables("Https_Server_Issuer")
服务器证书的发行者字段
Request.ServerVariables("Https_Server_Subject")
服务器证书的主题字段
Request.ServerVariables("Auth_Password")
当使用基本验证模式时,客户在密码对话框中输入的密码
Request.ServerVariables("Auth_Type")
是用户访问受保护的脚本时,服务器用於检验用户的验证方法
Request.ServerVariables("Auth_User")
代证的用户名
Request.ServerVariables("Cert_Cookie")
唯一的客户证书ID号
Request.ServerVariables("Cert_Flag")
客户证书标志,如有客户端证书,则bit0为0如果客户端证书验证无效,bit1被设置为1
Request.ServerVariables("Cert_Issuer")
用户证书中的发行者字段
Request.ServerVariables("Cert_Keysize")
安全套接字层连接关键字的位数,如128
Request.ServerVariables("Cert_Secretkeysize")
服务器验证私人关键字的位数如1024
Request.ServerVariables("Cert_Serialnumber")
客户证书的序列号字段
Request.ServerVariables("Cert_Server_Issuer")
服务器证书的发行者字段
Request.ServerVariables("Cert_Server_Subject")
服务器证书的主题字段
Request.ServerVariables("Cert_Subject")
客户端证书的主题字段
Request.ServerVariables("Content_Type")
客户发送的form内容或HTTPPUT的数据类型

第一步request.ServerVariables("HTTP_REFERER")
下列情况是从浏览器的地址栏正常取得Request.ServerVariables("HTTP_REFERER")的:
1.直接用<a href>
2.用Submit或<input type=image>提交的表单(POST or GET)
3.使用Jscript提交的表单(POST or GET)
下面我们再看看Request.ServerVariables("HTTP_REFERER")不能正常取值的情况:
1.从收藏夹链接
2.单击'主页'或者自定义的地址 (即直接手动从地址栏输入)
3.利用Jscript的location.href or location.replace()
4.在浏览器直接输入地址
5.<%Response.Redirect%>
6.<%Response.AddHeader%>或<meta http-equiv=refresh>转向
7.用XML加载地址
8.window.open()
显然,Request.ServerVariables("HTTP_REFERER")在多数情况下是不能正常工作的,下面我们看一个例子:
ref.asp <% response.write "You came from: " & request.servervariables("http_referer") %>
ref.htm <% Response.AddHeader "Refresh", "10;URL=ref.asp" %>
1.<meta http-equiv='refresh' content='10;URL=ref.asp'>
2.<form method=GET action=ref.asp name=getform>  
<input type=submit value=' Go there (GET) >> '>  
<input type=image style='cursor:hand'>  
</form> 看看上面的代码会得到什么的结果.
3.<form method=POST action=ref.asp name=postform>  
<input type=submit value=' Go there (POST) >> '>  
<input type=image style='cursor:hand'>  
</form>
4.<a href='ref.asp'>直接链接</a>
5.<a href='#' onclick='window.location.href="ref.asp";return false;'>javascript location</a>
6.<a href='#'onclick='window.location.replace("ref.asp");return false;'>javascript replace</a>
7.<a href='#' onclick='document.getform.submit();return false;'>javascript GET</a>
8.<a href='#' onclick='document.postform.submit();return false;'>javascript POST </a>
下面是关于来源伪造的信息的方法:(转自飘易博客)
Php版本:

<?php
//1.php
$host = '127.0.0.1';
$target = '/2.php';
$referer = 'http://www.piaoyi.org'; //伪造HTTP_REFERER地址
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if (!$fp){
echo "$errstr($errno)<br />\n";
}
else{
$out = "
GET $target HTTP/1.1
Host: $host
Referer: $referer
Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)){
echo fgets($fp, 1024);
}
fclose($fp);
}
?>
<?php
//2.php
echo "<hr />";
echo $_SERVER["HTTP_REFERER"];
?>
执行1.php文件,打开http://localhost/1.php,页面返回信息如下:
HTTP/1.1 200 OK Date: Fri, 04 Apr 2008 16:07:54 GMT Server: Apache/2.2.8 (Win32) PHP/5.2.5 X-Powered-By: PHP/5.2.5 Content-Length: 27 Connection: close Content-Type: text/html; charset=gb2312
--------------------------------------------------------------------------------
http://www.piaoyi.org    看到了结果了吧,伪造来源HTTP_REFERER信息成功。所以,如果你的网站仅仅是判断HTTP_REFERER,并不是安全的,别人一样可以构造这样的来源,简单的防御方法就是验证页里加上验证码;还可以结合IP判断的方法(丹木秋风备:验证码的方法实际就是临时产生的session值于服务器端,以检测这样对于来源页面也需加入显式的验证码供读取。)
ASP下的伪造来源的代码如下
<%dim http
set http=server.createobject("MSXML2.XMLHTTP") '//MSXML2.serverXMLHTTP也可以
Http.open "GET",url,false
Http.setRequestHeader "Referer","http://www.piaoyi.org/"
Http.send() %>
总结:判断的时候首先isnothing,然后是否是空
第二步check是否为空,否则执行是否是本站内部数据方式的检验,最好将是代理的单独提出来供开关选择
asp中
clng(instrrev(ComeUrl,MyhostUrl))=0则本站域部分字不包含在来源中,执行更深入检查
lcase(left(ComeUrl,instrrev(ComeUrl,"/")))与lcase(left(MyhostUrl,instrrev(MyhostUrl,"/")))这样主域是否正确才能真实的得到(避免伪造referer的前提下).
php中
stristr($ComeUrl,$MyhostUrl)或explode($MyhostUrl,$ComeUrl)等判断是否包含字否则执行更深入检查
是否在主域中,对于网上的钓鱼地址方式,其实也可以直接执行此步将上面的包含字检验给去掉.
第三步对于本域的xss攻击决定了还要检验来源文件地址是否是定义的文件地址,如果程序是多用户同post文件那么应该是参数检验,那么参数的唯一性是必须的,记得当年有个wokankan的站这个漏洞就超级明显
第四步防刷,同IP的单位时间刷新率,有复活机制,同时保留单位操作记数,达到无聊操作数的直接封IP
貌似baidu博客现在在尝试该机制,不过无聊数是多少就不知道,呵呵,我怕封,我可是固定地址哦
第五步防单位时间大量请求数据操作页,用当前在线的量与时间段的综合考虑是否被ddos了,其实脚本级的处理对大局没太大影响,不过也有一定作用.转静态吧!呵呵整理整理我将代码模块写出来!

上一篇: 这周末将C++的类学了个遍,回头看看asp的类
下一篇: 工具列表