2009-07-04 23 views
1

我有一個網站,告訴輸出是UTF-8,但我從來沒有確定它是。我應該使用正則表達式還是Iconv庫將UTF-8轉換爲UTF-8(留下無效序列)?如果我不這樣做,這是一個安全問題嗎?我是否需要確保輸出數據是有效的UTF-8?

+1

數據來自哪裏,您無法確保數據是UTF-8編碼? – Gumbo 2009-07-04 18:15:48

回答

2

首先,我永遠不會盲目地將它編碼爲UTF-8(可能)第二次,因爲這會導致無效的字符,如你所說。在嘗試這樣的事情之前,我肯定會嘗試檢測內容的字符集是否爲而不是 UTF-8。

其次,如果有問題的內容來自源代碼,您可以控制並控制字符集,例如UTF-8文件或UTF-8數據庫在表格和連接中使用,則我會相信這個來源,除非有東西給我提示,我不能和有一些奇怪的事情發生。如果內容來自您的控制之外的或多或少的隨機位置,那麼更有理由檢查它,並且如果可以檢測到它,可能嘗試從其他字符集重新編碼og變換。所以底線是:這取決於。

至於這是一個安全問題,我不這麼認爲(至少我不能想到任何可能被利用的情況),但我會留給其他人來確定。

1

不是一個安全問題,但如果您發送無效的UTF-8字節流,您的用戶(尤其是非英語)將會非常惱火。

在最好的情況下(大多數瀏覽器都這麼做),所有無效的字符串都會消失或顯示爲亂碼。最糟糕的情況是,瀏覽器退出解釋你的頁面,並說「無效編碼」。這就是Linux上的一些文本編輯器(即gedit)所做的。如果你有一個以英文爲中心的網站而沒有嚴重依賴一些數學字符或Unicode箭頭,它幾乎沒有任何區別。但是如果你服務的話,比如說一箇中國網站,你可以把它搞砸。

乾杯,

1

每個人都變得亂七八糟的字符集,所以一般你不能相信任何外部來源。驗證提供的輸入對於聲稱使用的字符集是否確實有效是一種很好的做法。幸運的是,使用UTF-8,您可以對有效性做出相當安全的斷言。

0

如果用戶有可能發送任意字節,那麼是的,存在不確保有效utf8輸出的安全隱患。但是,根據數據存儲方式的不同,還有一些安全隱患是不能確保輸入輸入上的有效utf8數據(例如,如果允許utf8無效,可以創建一個使用utf8輸入的this SQL injection attack變體utf8),所以你真的應該使用iconv來將utf8轉換爲utf8的輸入,並避免在輸出上驗證utf8的整個問題。

你想要檢查輸出是否有效的兩個主要安全原因utf-8是爲了避免「超長」字節序列 - 也就是說,字節序列的情況下,意味着像'<'一些字符,但編碼爲多個字節 - 並避免無效的字節序列。過長的編碼問題很明顯 - 如果您的過濾器將「<」更改爲「&lt;」,則它可能不會轉換意味着'<'但寫入方式不同的序列。請注意,所有當代瀏覽器都會將過長的序列標記爲無效,但有些人可能正在使用舊瀏覽器。

無效序列的問題是,一些utf-8解析器將允許無效序列吃掉無效序列後面的一些有效字節。同樣,如果每個人始終都有當前瀏覽器,則不是問題,但...

相關問題