跨站脚本攻击(XSS攻击)

4
我只有一个关于XSS攻击的简单问题。我知道你可以通过对表单输入进行清理来防止它们,但我的问题是,搜索输入(例如网站上的通用搜索)该怎么办?我们也应该对搜索输入进行清理吗?我的意思是,这只是一个搜索输入,用户应该能够在网站上搜索任何他/她想要的东西。请给我一些说明。
谢谢
5个回答

7
我知道你可以通过净化表单输入来防止它们,但是不行,你应该通过净化输出来预防。因此,在数据库(或其他地方),您需要将数据原样传递,并在向用户显示之前对其进行处理。

1
@Lawrence Cherone:那就是另一回事了。OP专门问的是关于XSS的。 - zerkms
除了我想在网站上正确显示HTML(或其他客户端字符)之外,为什么我要对XSS攻击的输出进行净化(而不是输入)?恶意代码不是来自输入吗?我的意思是,用户输入客户端代码,我认为这就是我应该净化的内容(使用htmlentities())。我错过了其他什么吗? - user765368
@user765368:是的,你忽略了一个事实,对于不同的输出设备,你需要执行不同的清理函数:如果要输出到浏览器,你需要使用htmlspecialchars函数;如果要输出到文件或电子邮件,你则不需要应用任何函数等等。因此,在你知道你要输出到哪里之前,你无法知道如何进行清理。另外,如果你在输入时犯了一个错误怎么办?如何“重新清理”数据?如何知道哪些数据被清理得不正确?如果你在输出时进行清理,那么你只需在一个地方修复它一次,就不会有这样的麻烦了。 - zerkms

3

虽然zerkms已经回答过这个问题了

对于任何接触数据库的用户输入进行SQL注入的清理,需要使用mysql_real_escape_string($_REQUEST['search'])

如果您要显示用户搜索的内容,例如“您搜索了:”,请使用htmlentities(strip_tags($_REQUEST['search']), ENT_QUOTES);

这样,您就可以保证输入和输出的安全。


除了正确显示用户搜索的内容外,为了保护网站免受XSS攻击,需要对输入进行清理吗?还有其他目的需要对输出进行清理吗? - user765368

1

我只想在这里讨论中再添加一个观点。你说:

我的意思是,这只是一个搜索输入,用户应该能够在网站上搜索任何想要的内容。

但是有个问题:经常情况下,搜索词将被打印到搜索后呈现的文档中。也就是说,“您搜索了:<搜索内容>”。如果您没有对此进行消毒,那么这就是您的XSS漏洞所在。

如果您认为“但我们不这样做”,请记住,您现在可能不这样做,但未来可能会这样做。如果您现在不封闭此漏洞,您很可能会忘记以后这样做,因此最好在萌芽状态下解决问题。


1

1

SQL注入XSS是两种不同(但有些相关)的攻击。它们之间的关系在于,本质上归结为不受信任的数据从其放置的上下文中逃逸,并随后执行未预料到的操作。

为了遵循最佳实践来构建您的防御措施,我建议您阅读OWASP的SQL注入预防备忘单和他们的XSS预防备忘单

OWASP提出了ESAPI项目,其中包括用于编码不受信任数据可以使用的不同上下文的工具:

  • encodeForSQL
  • encodeForHTML
  • encodeForHTMLAttribute
  • encodeForJavaScript
  • encodeForCSS
  • encodeForURL

这个库可用于多种语言,包括Java、.NET、PHP、Classic ASP、Cold Fusion、Python和Haskell。如果需要,它还能执行输入验证。

一些使用ESAPI的组织包括美国运通公司、Apache基金会、Booz Allen Hamilton、Aspect Security、Foundstone(麦克菲)、哈特福德、无限校园、洛克希德·马丁公司、MITRE、美国海军-SPAWAR、世界银行、SANS研究所。

最后 - 编码应该在解释之前执行(越接近越好)。例如:在将不受信任的数据提供给UI组件进行呈现之前,您对其进行编码。UI组件不能信任服务器 - 它必须进行编码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接