防止xss攻击的更好方法

时间:2011-06-26 14:15:44

标签: php xss

这两个中哪一个是防止xss攻击的更好方法?

  1. 保存在db中的HTMLEntity
  2. 显示/回显时的HTMLEntity
  3. 我发现第一个更好,因为你可能忘记在显示时添加它。

4 个答案:

答案 0 :(得分:6)

  

这两者中哪一种是防止xss攻击的更好方法。

     
      
  1. 保存在db中的HTMLEntity
  2.   
  3. 显示/回显时的HTMLEntity
  4.   

2 - 您应该在最后一刻转换为目标格式。这可以帮助您避免遇到问题,例如,您决定要在电子邮件,PDF中使用相同的内容,将文本作为文本返回给用户进行编辑等等。

  

我找到第一个更好的因为你可能忘记在显示时添加这个

插入数据库时​​也可能会忘记。

此外,并非所有数据都会进入数据库。例如由于错误而要插入的数据或将数据放回到表单中的预览都是可能的XSS向量。您不希望处理诸如“在放入数据库之前进行编码,或者如果它不是来自数据库则回显到文档中”之类的事情。例外是让自己陷入忘记编码的最佳方式。

答案 1 :(得分:1)

如果您问我,最好的方法(选项编号3 ..)正在使用最新的filter扩展名为您处理过滤(PHP5)。我喜欢将filter_input_array放在我的php文件的顶部以保护自己免受例如POST XSS攻击

$_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

您应该阅读过滤器文档(教程)并保护自己免受XSS的侵害。

答案 2 :(得分:0)

在显示代码中编码的原因(即从数据库中读取文本后):

  • 可以在需要修改的基于非HTML的GUI中查看数据库。修改通用数据库管理工具以自动解码单个应用程序的特定文本(其中charset?)既不可行也不可取。
  • 不正确编码HTML意味着您必须信任数据库才是安全的。如果存在漏洞 - 直接在数据库或其他Web应用程序中,您的应用程序也将变得易受攻击。
  • 在数据库中存储编码的HTML会阻止搜索;你不能直接使用像Lucene这样的专用搜索库。此外,由于html编码可能不是双射的,因此全文搜索必须在数据库的解码副本上运行,或者解码数据库中的所有条目,从而产生O(数据库大小)性能。
  • 如果所有编码代码都集中在显示代码中,未来的编码转换也会更容易。
  • 编码会增加占用的存储空间

编写时我无法想到任何编码原因。你提到可能会忘记在显示逻辑中对数据进行编码,但我认为你同样可能会在存储代码的数据库中忘记它。

答案 3 :(得分:-1)

在保存到db之前,更好的方法是strip_tags()htmlentities()(如果你不介意一些额外的数据)。

但是,请确保您已采取其他预防措施以防止SQL注入,方法是使用mysql_real_escape_string()或预准备语句数据访问抽象层,例如PDO。