在PHP站点中避免xss攻击的最佳实践是什么?

Rik*_*ood 65 php security xss

我配置了PHP,以便启用魔术引号并关闭注册全局变量.

我会尽力为我输出的任何来自用户输入的内容调用htmlentities().

我偶尔也会搜索我的数据库,以获取xss附带的常用内容,例如......

<script
Run Code Online (Sandbox Code Playgroud)

我还应该做些什么,以及如何确保我要做的事情总是完成.

Mic*_*cki 58

逃避输入并不是您成功实施XSS预防的最佳选择.还必须转义输出.如果你使用Smarty模板引擎,你可以使用|escape:'htmlall'修饰符将所有敏感字符转换为HTML实体(我使用自己的|e修饰符,它是上面的别名).

我的输入/输出安全方法是:

  • 存储用户输入未修改(输入时没有HTML转义,只能通过PDO预处理语句完成数据库感知转义)
  • 输出中的转义,取决于您使用的输出格式(例如,HTML和JSON需要不同的转义规则)

  • htmlentities()是一种矫枉过正,它对编码敏感.htmlspecialchars()也可以保护. (5认同)
  • @AbdulJabbarWebBestow绝对没有.数据库是以输出不可知格式存储数据的位置.不同的输出设备需要不同的转义规则,因此通过在访问数据库之前转义HTML输出,您可以锁定自己编写API,PDF导出等.不要担心服务器负载.加载它们是他们的工作. (3认同)
  • htmlspecialchars可能不是你的朋友:http://stackoverflow.com/questions/110575/do-htmlspecialchars-and-mysqlrealescapestring-keep-my-php-code-safe-from-injec (2认同)

Jil*_*les 18

我认为在输入期间不应该逃避任何事情,只能在输出上.因为(大部分时间)你不能假设你知道数据的去向.例如,如果您的表单中包含稍后显示在您发送的电子邮件中的数据,则需要进行不同的转义(否则恶意用户可能会重写您的电子邮件标题).

换句话说,您只能在数据"离开"应用程序的最后时刻转义:

  • 项目清单
  • 写入XML文件,转义为XML
  • 写入DB,转义(对于特定的DBMS)
  • 写电子邮件,转发电子邮件
  • 等等

简而言之:

  1. 您不知道数据的去向
  2. 数据实际上最终可能会出现在多个地方,需要不同的转义机制但不是两者兼而有之
  3. 为错误的目标逃脱的数据真的不太好.(例如,收到主题为"去汤米的酒吧"的电子邮件.)

如果您在输入层转义数据(或者您需要再次对其进行转义等),则会出现Esp#3.

PS:我会提出不使用magic_quotes的建议,这些都是纯粹的邪恶!


Chr*_*der 12

有很多方法可以做XSS(参见http://ha.ckers.org/xss.html)并且很难捕捉到.

我个人将此委托给我正在使用的当前框架(例如Code Igniter).虽然不完美,但它可能比我手工制作的程序更有效.


Mat*_*ina 10

这是一个很好的问题.

首先,除了使其安全存储(例如放入数据库)之外,不要在输入上转义文本.这样做的原因是您希望保留输入的内容,以便您可以以不同的方式和位置进行上下文显示.在此处进行更改可能会影响以后的演示.

当你去展示你不应该存在的数据时.例如,如果javascript没有理由在那里搜索并删除它.一种简单的方法是使用strip_tags函数并仅显示您允许的html标记.

接下来,拿走你所拥有的并传递它的想法htmlentities或htmlspecialchars来改变那里的ascii字符.根据上下文和你想要的内容来做这件事.

我也建议关闭Magic Quotes.它已从PHP 6中删除,被认为是使用它的不良做法.详情请访问http://us3.php.net/magic_quotes

有关更多详细信息,请访问http://ha.ckers.org/xss.html

这不是一个完整的答案,但希望足以帮助您入门.


Mas*_*son 7

rikh写道:

我会尽力为我输出的任何来自用户输入的内容调用htmlentities().

请参阅Joel关于使代码看起来错误的文章以获得帮助


小智 5

模板库。或者至少,这是模板库应该做的。为了防止 XSS,所有输出都应该被编码。这不是主要应用程序/控制逻辑的任务,它应该完全由输出方法处理。

如果您在整个代码中使用 htmlentities(),则整体设计是错误的。正如您所建议的,您可能会错过一两个景点。这就是为什么唯一的解决方案是严格的 html 编码-> 当输出变量被写入 html/xml 流时。

不幸的是,大多数 php 模板库只添加自己的模板语法,而不关心输出编码、本地化、html 验证或任何重要的事情。也许其他人知道一个合适的 php 模板库?