【问题标题】:better way preventing xss attack防止xss攻击的更好方法
【发布时间】:2023-04-06 17:56:01
【问题描述】:

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

  1. 保存在 db 中的 HTMLEntities
  2. 显示/回显时的 HTMLEntities

我发现第一个更好,因为您可能在显示时忘记添加它。

【问题讨论】:

  • 第二个可能会更好,因为您可能会在保存到数据库时忘记这样做。

标签: php xss


【解决方案1】:

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

  1. 保存在 db 中的 HTMLEntities
  2. 显示/回显时的 HTMLEntities

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

我发现第一个更好,因为您可能会在显示时忘记添加它

你也可能在插入数据库时​​忘记了。

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

【讨论】:

  • 我的意思是在每个模型的 before_save 函数中添加它。请在最后一行解释一下
  • “插入 HTML 文档时转换为 HTML”之类的简单规则优于“插入 HTML 文档时以及从 @ 插入 HTML 文档时”之类的复杂规则987654321@,以及从文件插入 HTML 文档时”。
  • 很抱歉我还是不明白
  • 没有办法进一步简化它。看不懂的就去查一下看不懂的词。
  • @Web Developer 您的安全规则比“在呈现代码中正确编码”要复杂得多。复杂的规则更难遵循;它们的实现容易出错,因此容易出现 XSS 漏洞。
【解决方案2】:

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

$_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

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

【讨论】:

  • 这是一种危险的做法(错过了GET 和 SQL 注入),并且对受损的数据库没有帮助。此外,它还会修改合法的输入。
  • @phihag 我说例如...如果您拥有的(GET、SESSION 等)多于您也应该保护它们,并且您不必总是将它们放在顶部。我说我喜欢。对于 SQL 注入,您应该真正使用带有参数化查询的 PDO...
  • @phihag filter_input_array 类型可以是:"INPUT_GET、INPUT_POST、INPUT_COOKIE、INPUT_SERVER 或 INPUT_ENV。"
【解决方案3】:

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

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

写作时我想不出任何编码的理由。您提到有人可能会忘记在显示逻辑中对数据进行编码,但我认为您同样可能会在存储代码的数据库中忘记它。

【讨论】:

  • 1.当然,您应该已经知道 HTML 实体及其含义,不是吗? 2. 如果你关上大门,关上房间的门,任何讨厌的东西都很难进入你的房间。 3. 为什么?您可以轻松地搜索实体,不是吗? 4. 当然,您可以随时解码实体并进行任何您喜欢的进一步编码转换。
  • 1.如果您在显示代码中进行编码,则基于非 HTML 的 UI 不需要任何修改,它就可以工作。但你是对的,如果不是用于一般数据库管理,其他程序可以应用 html_entity_decode 的等价物。 2. 不需要从 Web 应用程序中利用数据库中的漏洞。有时,数据库主机损坏,或者数据库密码被猜到。用你的比喻来说:你宁愿在访客之前打扫房间,因为你可以保护门和大门,但忘记墙壁和天花板。
  • 我的问题是:如果使用基于 HTML 的业余 GUI 查看数据库会怎样?
  • 3.不,因为输入和 HTML 编码文本之间的映射不是双射的,所以您必须解码数据库中的每一个条目。此外,任何第三方搜索工具(如 Solr)都必须先进行修改,然后才能与包含 HTML 编码字符串的数据库结合使用。 4. 是的,但这意味着您必须关闭应用程序,对所有内容进行解码和重新编码,然后再次打开数据库。这在大规模分布式部署中是不可行的。
  • @Shef 那么业余的基于 HTML 的 GUI 中有一个安全漏洞需要修复。
【解决方案4】:

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

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

【讨论】:

  • strip_tags 不必要地修改了有效输入。此外,您没有回答何时编码的问题。
  • @phihag:谢谢你的意见。仔细看看$allowable_tags 参数?这是个人选择的问题。他/她的问题没有明确简洁的答案。我相信我以我喜欢的方式回答了它,即在插入 db 之前。感谢您的反对票。 ;)
  • @Shef 无论您将$allowable_tags 设置为什么,this question 都会出现乱码。
  • @phihag:解释一下为什么会这样?
  • @Shef 因为strip_tags 不可逆,所以像a<!--b-->c 这样的合法输入将呈现为ab。
猜你喜欢
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
相关资源
最近更新 更多