2017-08-29 69 views
1

我使用我的網站上htmlspecialchars()顯示來自用戶狀態後。 狀態信息正被保存到我的數據庫中,並顯示在他們的時間表中。如何允許和符號使用時用htmlspecialchars()

我使用laravel 5.3

的問題是,如果有人張貼類似:Netflix & Chill,這變成Netflix & Chill

我怎麼能仍然使用htmlspecialchars(),這樣我可以保持我的網站安全,但仍顯示正確的文本,而不是轉向,甚至象徵&&

+3

HTML將其解釋''&並將其顯示爲'&',或者是你,否則經歷?也許你在字符串上使用這個函數兩次?你是在輸出中使用它,還是輸入到數據庫中? – Qirel

回答

2

應該顯示正確的文本。

我已經看到了你所描述的是雙編碼的最常見原因。 (通過htmlspecialchars傳遞字符串的兩倍。)例如,

$str = 'Netflix & Chill'; 

如果使用echo htmlspecialchars($str),你會看到「Netflix的&冰寒」在瀏覽器中。但是,如果您使用echo htmlspecialchars(htmlspecialchars($str));代替,則會在瀏覽器中看到跳過的&符號。 (如果您查看網頁的源文件,它實際上Netflix & Chill的。)

你可能會不經意地這樣做,如果你正在使用的自動轉義輸出的模板。我注意到你用Laravel標記了這個問題,而刀片模板就是這樣做的。在這裏看到the documentation

刀片{{ }}語句通過PHP的用htmlspecialchars自動發送功能,以防止XSS攻擊。

如果這就是您用來顯示數據的內容,則在將值發送到模板之前,不應使用htmlspecialchars

+1

也可能是輸入的數據已經有'&'。您可以使用'$ double_encode'參數禁用雙重編碼的PHP。 http://php.net/manual/en/function.htmlspecialchars。php – Charles

+0

@Charles好點。我不知道模板中的自動轉義是否使用該參數。 –

+0

@ Don'tPanic我在我看來這樣做{!! $ linkify-> process(nl2br(htmlspecialchars($ status-> body)))!!} – Luna

0

htmlspecialchars原始ASCII字符轉換成它的HTML實體。這意味着,他們仍然會被正確的頁面(即一個<符號仍然會出現如<在頁面上)上呈現,但不會有任何HTML特殊的意義。

因此,在數據庫,他們將顯示爲entity codes,但是當顯示到,用戶將能夠看到他們爲他們輸入的首字符。

如果你需要保留數據庫中的字符(我不知道爲什麼你需要),你可以考慮用homoglyphs來代替它們,因爲它們保留了它們在數據庫中的外觀,並且保護你的HTML不是如果您僅使用htpspecialchars,則可能。

相關問題