[英]Do I need to make sure output data is valid UTF-8?
我有一個網站,告訴輸出是UTF-8,但我從來沒有確定它是。 我應該使用正則表達式或Iconv庫將UTF-8轉換為UTF-8(留下無效序列)嗎? 如果我不這樣做,這是一個安全問題嗎?
首先,我永遠不會盲目地將它編碼為UTF-8(可能)第二次,因為這會導致無效的字符,如你所說。 在嘗試這樣的事情之前,我當然會嘗試檢測內容的字符集是否不是 UTF-8。
其次,如果有問題的內容來自您可以控制和控制字符集的源,例如使用UTF-8的文件或在表和連接中使用UTF-8的數據庫,我會相信該來源除非有些東西給我提示我不能,並且有一些時髦的東西。 如果內容來自您控制范圍之外的或多或少的隨機位置,那么更有理由檢查它並可能嘗試從其他字符集重新編碼og變換(如果您可以檢測到它)。 所以底線是:這取決於。
至於這是一個安全問題與否,我不會這么認為(至少我不能想到任何可以利用這種情況的情況)但我會留給其他人明確這一點。
不是安全問題,但如果您發送無效的UTF-8字節流,您的用戶(尤其是非英語用戶)將非常惱火。
在最好的情況下(大多數瀏覽器都這樣做),所有無效字符串都會消失或顯示為亂碼。 最糟糕的情況是瀏覽器退出解釋您的頁面並說出“無效編碼”之類的內容。 這就是Linux上的一些文本編輯器(即gedit)所做的事情。
好吧,保持現實:如果你有一個以英語為中心的網站,而不是非常依賴一些數學字符或Unicode箭頭,它幾乎沒有任何區別。 但是,如果你服務,例如,一個中國網站,你可以完全搞砸它。
干杯,
每個人都把亂七八糟的東西搞砸了,所以一般來說你不能相信任何外部來源。 驗證提供的輸入確實對其聲稱使用的字符集有效是一種很好的做法。 幸運的是,使用UTF-8,您可以對有效性做出相當安全的斷言。
如果用戶可以發送任意字節,那么是的,不確保有效的utf8輸出存在安全隱患。 但是,根據您存儲數據的方式,還有一些安全隱患,即無法確保輸入上的有效utf8數據(例如,如果允許utf8,則可以創建此SQL注入攻擊的變體, 該變體適用於utf8輸入無效的utf8),所以你真的應該使用iconv
在輸入時將utf8轉換為utf8,並且避免在輸出時驗證utf8的整個問題。
要檢查輸出是否有效utf-8的兩個主要安全原因是避免“過長”字節序列 - 也就是說,字節序列的意思是某些字符如“ <
”但是以多個字節編碼 - 並且避免無效的字節序列。 過長的編碼問題很明顯 - 如果您的過濾器將' <
'更改為' <
',它可能不會轉換意味着 ' <
'的序列,但是它的編寫方式不同。 請注意,所有當前生成的瀏覽器都會將超長序列標記為無效,但有些人可能會使用舊版瀏覽器。
無效序列的問題是某些utf-8解析器將允許無效序列吃掉跟隨無效序列的一些有效字節。 如果每個人都有一個當前的瀏覽器,那么這不是問題,但......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.