2013-05-20 73 views
4

我目前正在收緊我的網站上的安全性,並且正在努力確保從PHP傳遞到HTML的每個值都被正確編碼。避免意外的double htmlspecialchars編碼?

當前,將值分配給模板將對其進行編碼,但是網站的某些部分是舊的並且不使用模板。

我改變了我用來輸出HTML來編碼所有值的函數的工作方式。這對覆蓋所有舊頁面非常有用,但是現在它會在模板值上導致雙重編碼。

我改變我用做編碼功能:

$textToEncode = htmlspecialchars_decode($szText); 
return htmlspecialchars($textToEncode, ENT_COMPAT, 'ISO-8859-1'); 

這從我所看到的工作。通過首先對它進行解碼,它將始終確保它不會進行雙重編碼,並且我無法想到解碼未編碼字符串會導致問題的任何原因。這是一個好的解決方案嗎?

+3

未編碼串:'「0類型呈現&字符「'。解碼會導致問題。 – Quentin

+0

@Quentin拉梅d:如果我把它與解碼上,我得到'「類型和渲染和字符」'如果我用它關閉做到這一點,我得到'「類型&放大器;渲染&字符「'看起來我很長時間了。 – MatthewMcGovern

回答

6

你簡直失去了運氣。你要麼知道一個字符串是否被編碼。你無法檢測或猜測。如果我的意思是寫「& amp」,該怎麼辦?並在數據庫中的字符串包含的價值?這是原始的,未編碼的字符串。但它看起來編碼。

你需要跟蹤的地點,時間和你爲什麼編碼字符串,你不能在事後弄清楚可靠。

如果你的用戶在你的假設的論壇上寫下這樣的:

的HTML實體「&」是「&安培;」。

那麼你的解碼和編碼,或「智能非雙編碼」是@Robert暗示,會變成這樣:

的HTML實體「&」是「&」。

而且該職位的所有意義都將丟失。

+0

不是我想要的答案:P但是這是正確的答案。 – MatthewMcGovern

+0

對不起,我不得不打破你的真相...;) – deceze

1

爲您的解決方案是使用double_encode PARAM在用htmlspecialchars

從手冊:

當double_encode關閉PHP不會編碼現有的HTML實體,默認的是轉換一切。

Double_encode在PHP 5.2中添加。3

htmlspecialchars ($stringToEncode, $flags, $charsetEncoding , $double_encode); 
+0

請看我的回答... – deceze

+0

我明白你的觀點。但是最好使用double_encode而不是編碼兩次編碼的文本。參數阻止編碼現有的html實體。有人把字符串按照你的建議放在邊緣 – Robert

+0

非程序員可能會故意寫HTML實體,但人們在互聯網上整天寫出不符合語法/不正確的特殊字符的垃圾非常罕見。如果你得到一些隨機結果,請不要感到驚訝&etc; -3LOL&j/k <3 :) – deceze

5

如果你看一下說明書,你會發現你要尋找的是什麼功能的最後一個參數 - $double_encode = ,這是真正的通過默認情況下:

string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] 

因此:

htmlspecialchars($textToEncode, ENT_COMPAT, 'ISO-8859-1', false);