【2019】問題記錄一:后端獲取URL參數的值內加號“+”變成空格“ ”


問題:URL參數中加號“+”變成空格“ ”

一、現象

     URL如:http://example.****.com/controller/action?param=rice+cook+panda

  后端通過Request.QueryString["param"]的方式獲取值的時候,數值中的加號“+”會轉換為空格“ ”

  例如傳輸“rice+cook+panda”,就會取到“rice cook panda”

二、原因

  W3C標准規定,當Content-Type為application/x-www-form-urlencoded時,URL中查詢參數名和參數值中空格要用加號+替代,所以幾乎所有使用該規范的瀏覽器在表單提交后,URL查詢參數中空格都會被編成加號+。

  而在另一份規范RFC2396,定義URI里, URI里的保留字符都需轉義成%HH格式(Section 3.4 Query Component),因此空格會被編碼成%20,加號+本身也作為保留字而被編成%2B,對於某些遵循RFC 2396標准的應用來說,它可能不接受查詢字符串中出現加號+,認為它是非法字符。

  所以一個安全的舉措是URL中統一使用%20來編碼空格字符。

三、解決思路和方法

  了解了原因,解決就針對出現這種情況的原因做處理。

       處理思路:將URL中的+號替換為%2B

       處理后的URL應為:http://example.****.com/controller/action?param=rice%2Bcook%2Bpanda

       1、發送端處理辦法

  不同的編程語言對此類問題解決方法,大同小異,最終目的都是將參數內的加號“+”替換為%2B:

        Java解決方法(推薦)

 URLEncoder.encode("rice+cook+panda","UTF-8"); 

        C#解決方法(推薦)

 HttpUtility.UrlEncode("rice+cook+panda"); 

 Server.UrlEncode("rice+cook+panda") 

        JS解決方法(推薦)

 encodeURIComponent("rice+cook+panda") 

通用笨方法(不推薦):將參數內的+號采用repace函數替換為%2B

        2、接收端處理辦法

       此問題原因出在發送端,所以不建議在接收端做特殊處理。

  特殊情況下(只針對某單個URL的參數臨時應急):接收端處理方法,可強制將獲取參數內的空格變為加號" "通過Replace方法“ ”替換為+號(不推薦使用,這個就是坑)

四、問題拓展延伸

  這個提問,主要是URL對參數內的特殊符號進行了特殊處理導致,+號有這種情況,自然其他特殊符號也存在類似情況 如: / = 等。

  因此推薦采用各種編程語言內部處理url的函數來解決此類問題,不建議采用發現一個替換一個的方式,更不建議接收端做特殊處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM