2011-03-10 101 views
1

是否阻止XSS真的意味着我必須運行htmlspecialchars()每次輸出一些用戶輸入?例如,每次我顯示用戶名稱?似乎真的很乏味。用PHP防止XSS

有沒有更簡單的方法?

+0

使用較短的名稱使封裝函數更簡單。 (也要避免charset參數。)或者在你的模板上使用array_map + htmlescape。 – mario 2011-03-10 04:14:01

+1

[使錯誤的代碼看起來錯了](http://www.joelonsoftware.com/articles/Wrong.html)對這類事情進行了有趣的討論,並在變量名上使用了前綴以確保您不會意外忘記運行htmlspecialchars()。也就是說,手動做任何事情都是一種拖拽 - 抽象化它! – chucksmash 2011-03-10 04:19:06

回答

3

如果您擔心成爲攻擊的目標,那麼您應該始終確保表單是從您的網站提交的,而不是從外部提交的資源。你可以使用會話:如果會話中的值,表單沒問題,否則表單使用機器人提交。

如果您擔心託管惡意腳本,那麼是的,您必須避開所有用戶輸入的內容以供公共和管理員使用。

這應該更容易:

function h($string) { 
    return htmlspecialchars($string); 
} 

你可能要考慮將逃不出你的變量爲你的模板語言:

EG。 http://www.h2o-template.org/

+3

...除非,如果你是偏執狂的人,你會想要使用'htmlspecialchars($ string,ENT_QUOTES,'UTF-8')' – sdleihssirhc 2011-03-10 04:12:16

+0

他說/ \ \ – Dimitry 2011-03-10 04:13:56

0

是的,每一次。

唯一更簡單的方法是使用一個模板,爲您做到這一點。自己製作一個,或者看看XSLT或我的個人喜好PHPTAL

+0

模板爲您做了什麼?即,代碼是什麼樣的? – 2011-03-10 04:50:34

+0

它爲你做什麼,它看起來像是非常不同的話題。許多模板具有不同的語法。例如,PHPTAL看起來就像xml。 Smarty看起來醜陋,戴着牙套,但每個人都是自己的。模板系統在您的(x)html代碼中實施結構,將業務邏輯從視圖中分離出來,保持代碼清潔,並且可以自動執行一些任務,例如編碼輸入 – 2011-03-10 14:32:28

0

它也取決於您所期望的內容類型。例如如果你只希望字母,那麼你可以做

$input = preg_replace("/[^a-zA-Z]*/", "", $input); 

,或者如果你只是希望數字

$input = preg_replace("/[^0-9]*/", "", $input); 

,或者如果它是混合和其他字符所預期的,那麼你將不得不使用

$input = htmlspecialchars($input, ENT_QUOTES, 'UTF-8');