首先需要聲明,本文純屬1個毫無遠見和真才實學的小小開發人員的愚昧見解,僅供用于web系統安全方面的參考,請勿用與非法用處。
在互聯網中,大量的數據通過URL參數的方式進行傳遞,大部份的數據,是沒有通過加密進行傳輸。在我所了解到的情況,大部份的數據是通過明碼進行…
固然,現在大家都知道,URL參數,安全性不是特別高,因而http信息頭(包括referer等屬性)進入了大家的視野。
Referer用來表明,閱讀器向 WEB 服務器表明自己來自哪里。
不知道從甚么時候起,相比起直接的URL參數,很多人都認為HTTP信息頭有更加強悍的防攥改的能力。 很多開發者信任通過cookie和http信息頭提交的數值,而對URL參數進行嚴格控制。
這類認識不那末全面,由于對任何使用數據攔截代理服務器的人來講,所有的數據都是暴露在外面的。
根據w3.org標準,http信息頭完全是可選的。也就是,Referer屬性也是可以變化的。
比如有1個修改用戶密碼的頁面,這個頁面必須要管理員操作。
我們想固然的認為,如果我們可以判斷這個頁面來自管理員,那末就是可信任的,是可以操作的。
為了安全起見,我們把這個驗證的信息不放在URL中,我們放在HTTP信息里,看起來很高大上吧。
http_accept.jsp
<%@ page language="java" import="java.util.*,javax.servlet.http.*" pageEncoding="UTF⑻"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>看好你的門-阿飯同學</title>
</head>
<body>
如果不是來自超級管理員,那末我沒法被訪問(超級管理員是來自1個叫做admin.jsp的頁面,保持在http頭中的referer) <br>
地址:<%=(String)request.getRemoteAddr()%> <br>
編碼:<%=(String)request.getCharacterEncoding() %> <br>
<%
//response.setHeader("referer","admin.jsp");
Enumeration<String> reqHeadInfos = request.getHeaderNames();
int i = 0;
while (reqHeadInfos.hasMoreElements()) {
String headName = (String) reqHeadInfos.nextElement();
String headValue = request.getHeader(headName);//根據要求頭的名字獲得對應的要求頭的值
out.write(headName + ":" + headValue);
out.write("<br/>");
if (headName.equals("referer") && (headValue.equals("admin.jsp"))){
i = 1; // 登陸成功
}
}
out.write("<br/>");
out.write(" <h3 style='color:red;'>");
if ( i == 1){
out.write("恭喜管理員,訪問成功");
}else{
out.write("不是管理員,請從管理員頁面進入");
}
out.write("</h3>");
%> <br>
</body>
</html>
運行1下:http://127.0.0.1:8080/webStudy/http_accept.jsp
結果:
如果不是來自超級管理員,那末我沒法被訪問(超級管理員是來自1個叫做admin.jsp的頁面,保持在http頭中的referer)
地址:127.0.0.1
編碼:null
host:127.0.0.1:8080
connection:keep-alive
accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
user-agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36
accept-encoding:gzip,deflate,sdch
accept-language:zh-CN,zh;q=0.8
cookie:JSESSIONID=2B927E8B22425D29CB623BD35970CF08
不是管理員,請從管理員頁面進入
由于我是直接訪問鏈接的,因此沒有referer屬性,好像看起來很不錯。
我另外寫1個簡單代碼驗證:
http_visit.jsp
<%@ page language="java" import="java.util.*,javax.servlet.http.*" pageEncoding="UTF⑻"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>看好你的門-阿飯同學</title>
</head>
<body>
我不是管理員,我只是來弄山寨的 <br>
<a href="http_accept.jsp"> 點我訪問http_accept.jsp</a>
</body>
</html>
訪問:http://127.0.0.1:8080/webStudy/http_visit.jsp
顯示:
如果不是來自超級管理員,那末我沒法被訪問(超級管理員是來自1個叫做admin.jsp的頁面,保持在http頭中的referer)
地址:127.0.0.1
編碼:null
host:127.0.0.1:8080
connection:keep-alive
accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
user-agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36
referer:http://127.0.0.1:8080/webStudy/http_visit.jsp
accept-encoding:gzip,deflate,sdch
accept-language:zh-CN,zh;q=0.8
cookie:JSESSIONID=703D6301DAC606173E0118D0DD35BEA1
不是管理員,請從管理員頁面進入。
其中,referer:http://127.0.0.1:8080/webStudy/http_visit.jsp
正是我們剛才訪問的鏈接,非常好。測試很成功。 贊贊贊。
http信息頭雖然沒有顯示在屏幕上,看起來用戶也不能去修改。 但是客戶真個1切終究操作都是用戶控制,直接通過攔截代理服務器對數據進行修改就能夠訪問。