簡體   English   中英

我是否需要確保輸出數據是有效的UTF-8?

[英]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的兩個主要安全原因是避免“過長”字節序列 - 也就是說,字節序列的意思是某些字符如“ < ”但是以多個字節編碼 - 並且避免無效的字節序列。 過長的編碼問題很明顯 - 如果您的過濾器將' < '更改為' &lt; ',它可能不會轉換意味着 ' < '的序列,但是它的編寫方式不同。 請注意,所有當前生成的瀏覽器都會將超長序列標記為無效,但有些人可能會使用舊版瀏覽器。

無效序列的問題是某些utf-8解析器將允許無效序列吃掉跟隨無效序列的一些有效字節。 如果每個人都有一個當前的瀏覽器,那么這不是問題,但......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM