我正在创建一个您“发布”的网站,表单内容保存在 MySql 数据库中,并在加载页面时被检索,类似于 facebook。我构建了所有帖子并将原始 html 插入到模板中。问题是,当我在测试时,我注意到我可以将 javascript 或其他 HTML 写入表单并提交,并且在重新加载时,html 或 JS 将被视为源代码,而不是帖子。我认为一些简单的编码可以解决问题,但使用<form accept-charset="utf-8">
不起作用。有没有一种有效的方法来防止这种类型的安全漏洞?
5 回答
好吧,为了图片的完整性,我想提一下,您可以在 Pyramid 中清理用户输入的两个地方 - 在将数据保存到数据库之前,以及在输出数据之前模板。可以说,将 HTML/JavaScript 存储在数据库中并没有什么问题,它不会对您不利——只要您确保模板中呈现的所有内容都正确转义即可。
事实上,Chameleon 和 Mako 模板引擎都默认开启了 HTML 转义,所以如果你只是“像往常一样”使用它们,你永远不会让用户输入的 HTML 被注入到你的页面中——相反,它会被渲染为文本。没有这个,清理用户输入将是一项艰巨的任务,因为您需要检查用户输入数据的每个表单中的每个字段(即不仅“方便”的文本区域小部件,还有其他所有内容 - 用户名、用户电子邮件等.)。
因此,您必须做一些不寻常的事情(或使用其他模板库)才能使 Pyramid 以这种方式运行。如果您提供有关您正在使用的模板库的更多详细信息和代码示例,我们将能够找到以适当方式修复它的方法。
您所描述的攻击类型称为“Javascript 注入攻击”或“跨站点脚本 (XSS) 攻击”。你可能有更多的运气来寻找它。 使用 Python 清理用户输入是一个类似的问题,其中包括一些非常全面的答案,尽管最好的答案可能在这里
您可以将<script>
,<iframe>
标记替换为其他内容,也可以对字符串进行 html 编码,使其在页面上显示为文本,但不会由浏览器本身呈现。
<
用 < 和 > 对所有's 和's 进行字符串替换>
应该足以防止您看到的 XSS。
我找到了这个,它谈到了 python 中的 XSS 预防。
它有点小,但您可以编写一段代码来识别 html/javascript 代码的某些关键方面并采取相应的行动。例如,识别块,要么不允许传递该查询,要么对其进行编辑,使其不再是有效的 html....