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