2011-03-10 102 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');