URL編碼

URL編碼

浏覽器用來打包表單輸入的格式
url編碼是一種浏覽器用來打包表單輸入的格式。浏覽器從表單中獲取所有的name和其中的值,将它們以name/value參數編碼(移去那些不能傳送的字符,将數據排行等等)作為URL的一部分或者分離地發給服務器。在數據傳輸中有一些字符是無法進行傳輸的,所以我們需要對其進行編碼,傳輸後在進行解。[1]
    中文名:URL編碼 外文名: 别名: 含義:一種浏覽器用來打包表單輸入 對象:浏覽器 格式:theName=Ichabod+Crane 編碼規則:每對name/value由&;符分開

編碼規則

URL編碼遵循下列規則:每對name/value由&;符分開;每對來自表單的name/value由=符分開。如果用

戶沒有輸入值給這個name,那麼這個name還是出現,隻是無值。任何特殊的字符(就是那些不是簡單的七位ASCII,如漢字)将以百分符%用十六進制編碼,當然也包括象=,&;,和%這些特殊的字符。其實url編碼就是一個字符ascii碼的十六進制。不過稍微有些變動,需要在前面加上“%”。比如“”,它的ascii碼是92,92的十六進制是5c,所以“”的url編碼就是%5c。那麼漢字的url編碼呢?很簡單,看例子:“胡”的ascii碼是-17670,十六進制是BAFA,url編碼是“%BA%FA”。

防止sql注入

URL編碼平時我們是用不到的,因為IE會自動将你輸入到地址欄的非數字字母轉換為url編碼。或許你已經想起了,有人提出數據庫名字裡帶上“#”以防止被下載,因為IE遇到#就會忽略後面的字母。破解方法很簡單——用url編碼%23替換掉#。現在SQL注射非常流行,所以就有人寫了一些防注射的腳本。當然啦,思路不一樣,效果大不同。下面××SQL通用防注入asp版部分代碼。

Fy_Url=Request.ServerVariables("QUERY_STRING")

Fy_a=split(Fy_Url,"&")

REDIMFy_Cs(Ubound(Fy_a))

OnErrorResumeNext

forFy_x=0toubound(Fy_a)

Fy_Cs(Fy_x)=left(Fy_a(Fy_x),instr(Fy_a(Fy_x),"=")-1)

Next

ForFy_x=0toubound(Fy_Cs)

IfFy_Cs(Fy_x)<>""Then

IfInstr(lcase(Request(Fy_Cs(Fy_x))),"and")<>0then

Response.Write"出現錯誤!"

Response.End

EndIf

EndIf

Next

它的思路就是先獲得提交的數據,以“&”為分界獲得并處理name/value組,然後判斷value裡是否含有定義的關鍵字(這裡為求簡便,我隻留下了“and”),有之,則為注射。

乍一看去,value被檢查了,似乎沒有問題。是的,value不會有問題,可是,name呢?

它的name/value組值來自于Request.ServerVariables("QUERY_STRING"),呵呵,不好意思,這裡出問題了。Request.ServerVariables("QUERY_STRING")是得到客戶端提交的字符串,這裡并不會自動轉換url編碼,哈哈,如果我們把name進行url編碼再提交的話,呵呵,那就可以繞過檢查了。比如參數是ph4nt0m=lake2andlis0,此時程序能夠檢測到;如果提交%50h4nt0m=lake2andlis0(對p進行url編碼),程序就會去判斷%50h4nt0m的值,而%50h4nt0m會被轉換為ph4nt0m,所以%50h4nt0m值為空,于是就繞過了檢測。為什麼既然name不解碼可以繞過檢查而value就不能繞過呢?因為value的值取自Request(Fy_Cs(Fy_x)),這個服務器就會解碼的。程序怎麼改進呢?隻要能夠得到客戶端提交的數據是解碼後的就可以了,把得到name的語句改為ForEachSubmitNameInRequest.QueryString就可以了。

使用舉例

前言

編碼問題是JAVA初學者在web開發過程中經常會遇到問題,其中之一是URL中使用中文等非ASCII的字符造成服務器後台程序解析出現亂碼的問題。

常見出錯部分

也就是容易出現中文字符的部分:

(1)QueryString中的參數值

(2)servletpath

常見出錯原因

(1)浏覽器:我們的客戶端(浏覽器)本身并沒有遵循URI編碼的規範。

(2)Servlet服務器:Servlet服務器的沒有正确配置。

(3)開發人員并不了解Servlet的規範和API的含義。

servlet規範

(1)HttpServletRequest.setCharacterEncoding()方法僅僅隻适用于設置post提交的requestboda的編碼而不是設置get方法提交的queryString的編碼。該方法告訴應用服務器應該采用什麼編碼解析post傳過來的内容。

(2)HttpServletRequest.getPathInfo()返回的結果是由Servlet服務器解碼(decode)過的。

(3)HttpServletRequest.getRequestURI()返回的字符串沒有被Servlet服務器decoded過。

(4)POST提交的數據是作為requestbody的一部分。

(5)網頁的Http頭中ContentType("text/html;charset=GBK")的作用:

(a)告訴浏覽器網頁中數據是什麼編碼;

(b)表單提交時,通常浏覽器會根據ContentType指定的charset對表單中的數據編碼,然後發送給服務器的。

注意:這裡所說的ContentType是指http頭的ContentType,而不是在網頁中mete中的ContentType。

上一篇:華蓋

下一篇:代理服務

相關詞條

相關搜索

其它詞條