2010-03-30 21 views
1

我正在研究如何處理頁面集字符集之外的字符。瀏覽器/ PHP如何處理設置字符集外的字符?

在這種情況下,頁面被設置爲iso-8859-1,並且前面的程序員決定使用htmlentities($ string,ENT_COMPAT)轉義輸入。然後將其存儲到Mysql的Latin1表中。

由於表設置爲與頁面相同的字符集,我想知道是否需要該步驟。 我在http://floris.workingweb.nl/experiments/characters.php上做了一些實驗,看起來對於拉丁文1裏面的東西來說,有些字符是逃脫的,但是例如有一個捷克名字他們沒有。

這是因爲那些字符在Latin1之外?如果是這樣,那麼可以刪除這些特性,因爲它對拉丁文1以外的內容無幫助,並且對於拉丁文內部1,現在我不能看到它了......

回答

1

htmlentities只能翻譯它的字符知道(get_html_translation_table(HTML_ENTITIES)返回整個列表),並保持原樣。所以你是對的,將它用於非拉丁數據是沒有意義的。而且,數據庫條目的html編碼和使用latin1都是不好的想法,而且我建議將兩者都刪除。

一句警告:刪除htmlentities()後,請記住您仍然需要爲要插入到數據庫(mysql_escape_string或類似文件)中的數據轉義引號。

+0

謝謝,這就是我一直在尋找的東西。至於其他評論,我知道utf-8,但這是爲了以後,現在我需要解決手頭上擺脫數據庫中逃脫的東西的問題,我需要知道我是否在正確的軌道上 – Maarten 2010-03-30 14:00:35

+0

是的,數據庫中的HTML編碼數據是一種巨大的代碼異味。在將文本放入HTML頁面時應該調用htmlspecialchars,而不是與數據層有關。擺脫! – bobince 2010-03-30 14:05:17

+0

@Maarten:不要忘記您的數據仍然需要轉義(請參閱答案更新)。爲安全起見,應使用htmlspecialchars代替 – user187291 2010-03-30 14:19:35

0

他本可以使用它作爲基本的安全預防措施,即。以防止用戶將HTML/Javascript插入到輸入中(因爲<和>也會被轉義)。

btw如果你想支持東歐和西歐語言,我會建議使用UTF-8作爲默認字符編碼。

+0

。而不是在插入,但在顯示部分 – 2010-03-30 13:53:16

+0

約定,不要混亂的輸入,如果你可以避免它,只對sql注入過濾 – Maarten 2010-03-30 14:01:13

+0

「只對sql注入過濾」錯誤,你聽說過XSS攻擊吧?還有更多的安全性,然後檢查SQL注入。順便說一句,這只是一個基本的猜測是什麼編碼者的動機可能是使用htmlentities,而不是我自己的觀點,如何實現安全... – wimvds 2010-03-30 19:48:05

0


雖然不是因爲捷克字符不在Latin1中,而是因爲它們在表格中共享相同的位置。所以,數據庫把它作爲相應的latin1字符。

使用htmlentities總是不好。存儲不同語言的唯一適當的解決方案是使用UTF-8字符集。

+0

呃...你不是說使用'htmlentities'總是不好?這是'htmlspecialchars',這是轉義' bobince 2010-03-30 14:03:49

+0

非常感謝,我的壞,我的意思是實體。 – 2010-03-30 14:06:16

0

請注意,htmlentities/htmlspecialchars具有charset的第三個參數(自PHP 4.1.0起)。 ISO-8859-1是默認值,因此如果您將沒有第三個參數的htmlent應用於UTF-8字符串,則輸出將被損壞。

您可以檢測到&將輸入字符串轉換爲mb_detect_encodingmb_convert_encoding以確保輸入字符串與所需的字符集匹配。

+0

mb_detect_encoding也永遠不會被信任和無用。內容類型的頁面是足夠的 – 2010-03-30 14:00:35

+0

內容類型通常是足夠的,但如果輸入是用戶定義的,字符串可以是不同於內容類型指定的字符集。 – AlexV 2010-03-30 16:34:41