【问题标题】:Preventing a security breach防止安全漏洞
【发布时间】:2012-07-07 21:08:29
【问题描述】:

我正在创建一个您“发布”的网站,表单内容保存在 MySql 数据库中,并在加载页面时检索,类似于 facebook。我构建了所有帖子并将原始 html 插入到模板中。问题是,当我在测试时,我注意到我可以将 javascript 或其他 HTML 写入表单并提交,并且在重新加载时,html 或 JS 将被视为源代码,而不是帖子。我认为一些简单的编码可以解决问题,但是使用<form accept-charset="utf-8"> 是行不通的。是否有有效的方法来防止此类安全漏洞?

【问题讨论】:

  • 是的。不要将 HTML 保存在数据库中。
  • 这些类型的攻击称为 XSS(跨站点脚本)。
  • @Juhana 我没有保存 HTML,我保存的是从表单帖子中获得的内容,通常只是一些文本。但我在考虑攻击者,将 JavaScript 写入表单并提交,生成的 HTML 将包含 JS。
  • 换句话说,您将 HTML 保存在数据库中。
  • 您希望您的用户能够在您的帖子中使用 HTML 吗?如果你这样做了,那么你就有问题了。您必须找到一种安全的方法来确保他们使用您希望他们使用的标签并且不使用您不使用的标签,这很复杂而且不是很安全。如果您不这样做,请从帖子中完全删除 HTML。

标签: python html pyramid templating


【解决方案1】:

好吧,为了图片的完整性,我想提一下,您可以在 Pyramid 中清理用户输入的两个地方 - 在将数据保存到数据库之前,以及在输出之前,在渲染之前模板中的数据。可以说,将 HTML/JavaScript 存储在数据库中并没有什么问题,它不会对您不利——只要您确保模板中呈现的所有内容都正确转义即可。

事实上,Chameleon 和 Mako 模板引擎都默认开启了 HTML 转义,所以如果你“像往常一样”使用它们,你永远不会将用户输入的 HTML 注入到你的页面中——相反,它会被呈现为文本。如果没有这个,清理用户输入将是一项艰巨的任务,因为您需要检查用户输入数据的每个表单中的每个字段(即,不仅“方便”的文本区域小部件,还有其他所有内容 - 用户名、用户电子邮件等.).

因此,您必须做一些不寻常的事情(或使用其他模板库)才能使 Pyramid 以这种方式运行。如果您提供有关您正在使用的模板库的更多详细信息和代码示例,我们将能够找到以适当方式修复它的方法。

【讨论】:

  • 不得不说这里最聪明。过滤输出是使用模板引擎的原因之一。除非您禁用过滤,否则无需担心。按原样保存所有内容,但转义所有内容,如果需要,请使用自定义过滤器。 (就像一个过滤器,只允许带有类属性的跨度)
【解决方案2】:

您所描述的攻击类型称为“Javascript 注入攻击”或“跨站点脚本 (XSS) 攻击”。你可能有更多的运气来寻找它。 Sanitising user input using Python 是一个类似的问题,其中包含一些非常全面的答案,尽管最好的是 probably here

【讨论】:

  • 不是。它被称为 XSS(跨站点脚本)。 SQL 注入是另一回事。
  • @dAm2K 肯定不是 SQL 注入,但不会被认为是 Javascript 注入?
  • 是的,这是一种 javascript 注入。但是如果你用谷歌搜索“注入攻击”,你会发现 SQL 注入而不是 xss。
【解决方案3】:

我找到了这个,它谈到了 python 中的 XSS 预防。

Python library for XSS filtering?

【讨论】:

  • 谢谢,cgi.escape 函数在对帖子进行编码时效果很好!
【解决方案4】:

您可以将 <script><iframe> 标记替换为其他内容,或者您​​可以对字符串进行 html 编码,使其在页面上显示为文本,但不会由浏览器本身呈现。

使用 &lt 和 &gt 对所有 <> 进行字符串替换应该足以防止您看到的 XSS。

【讨论】:

    【解决方案5】:

    这有点不靠谱,但您可以编写一段代码来识别 html/javascript 代码的某些关键方面并采取相应措施。例如,识别块,要么不允许传递该查询,要么对其进行编辑,使其不再是有效的 html....

    【讨论】:

    • 然后浏览器开始支持另一个功能,而您没有在代码中考虑到它,并且还有另一个安全漏洞。幸运的是,只需转义 all html 特殊字符(特别是尖括号)就足以防止未来的功能成为问题..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 2021-08-19
    相关资源
    最近更新 更多