現在有乙個web遊戲登入介面,大致就是傳遞使用者名稱、伺服器id、使用者ip、登入時間完成遊戲登入資訊生成的功能。
鏈結大約是這樣的:
為了防止偽造請求,這些引數都需要進行簽名。簽名方式大致是把這些引數拼接起來再加乙個key進行md5運算。只要任何乙個引數被修改,md5值都會發生改變,簽名檢查就無法通過。
對於大部分使用者來說,這樣的登入流程都是沒有問題的,但有近期卻收到部分使用者無法登入遊戲的反饋,經過檢查伺服器日誌,發現無法登入的使用者都是因為呼叫介面時簽名錯誤了。在仔細分析發現簽名錯誤的鏈結確實是合法生成的,並非偽造或者其他惡意攻擊,之後再對比各個引數才找到問題原因,url鏈結中的ip跟鏈結生成時的ip不同,被替換掉了,所以造成簽名錯誤。
但分析了好久也沒找出ip是被**替換掉的,由於從鏈結生成到使用者使用修改後的鏈結訪問伺服器之間幾乎沒有時間差,可以排除使用者自己手動替換的可能性,並且ip被替換後會生成無法登入,所以也不太可能是使用者自己使用了特別的軟體導致這樣。在之後分析發現有問題的使用者全部是中國移動使用者,所以猜測可能是移動的節點伺服器搞的鬼,在經過一系列測試發現移動伺服器會將url中的使用者ip替換為自己伺服器的ip,推測可能是移動伺服器內部使用了某種**導致此種情況。
找到原因了想要解決就很簡單了,稍加修改下鏈結中的使用者ip,讓移動伺服器識別不出來就發了,比如把ip中的」.「替換成"_"(讀取時再反向替換回來),這樣就不是標準ip格式了,就不會被替換掉了,煩人的簽名錯誤也可以解決了。
示例:總結:由於上述情況的存在,在url鏈結中直接傳遞ip有一定風險,可以修改ip格式,先轉換成整型或者其他非ip格式,或者改為在post中請求,可以很好避免被**伺服器意外地替換ip,以致使用者無法正常訪問或者伺服器獲得到非期望的使用者ip。
原創:
關於HTTP GET請求的url中文引數編碼
場景 前端用js構造了乙個get請求,攜帶了乙個中文的引數,通過spring mvc傳到後台以後解析中文是亂碼。1.傳送請求,從瀏覽器中捕獲到http的請求內容如下 4 status code 201 created1 將utf 8格式的中文轉換成url編碼 2 encodestr urlencod...
關於HTTP GET請求的url中文引數編碼
場景 前端用js構造了乙個get請求,攜帶了乙個中文的引數,通過spring mvc傳到後台以後解析中文是亂碼。1.傳送請求,從瀏覽器中捕獲到http的請求內容如下 4 status code 201 created1 將utf 8格式的中文轉換成url編碼 2 encodestr urlencod...
iphone平台http get請求
直接貼原始碼 需要注意的是httpgetrequestviewcontroller 擁有nsmutabledata receivedata 這個成員。receivedate是在 void connection nsurlconnection connection didreceiveresponse...