目前正在编写一个bbs风格的应用程序,我想知道显示用户安全输入的文本的最佳做法是什么。这意味着我不希望他们输入javascript或类似的东西。现在我正在渲染,并禁止“<”和“>”字符。虽然我猜这不是正确的方法。加上线条切割,但不应该。
你可以给我一些关于如何做到这一点的提示吗?更多信息:我使用flask-sqlalchemy将这些帖子存储在sqlite数据库中。所以我不希望它们包含SQL-Injection(我非常怀疑它可能与sqlalchemy有关)
答案 0 :(得分:4)
如果您使用Flask设置的Jinja2模板,默认情况下所有内容都会自动转义为HTML字符;请参阅模板文档中的Jinja2 setup:
除非自定义,否则Jinja2由Flask配置如下:
- 为
结尾的所有模板启用了自动加密功能.html
,.htm
,.xml
以及.xhtml
- 模板可以使用
{% autoescape %}
代码选择加入/退出自动加载。
SQLAlchemy,如果使用得当,确实可以保护您免受SQL注入攻击。
如果您希望将用户输入中的换行符转换为HTML输出中的<br/>
标记,则可以使用此Flask Snippet添加Jinja2标记过滤器来执行此操作;将输入变量中的换行符转换为渲染输出中的<br/>
标记,同时仍然可以转义其他所有内容。多个换行符会转换为<p>
段落标记。
将该代码段作为模块添加到项目中,确保已导入,然后使用模板中的nl2br
过滤器:
User text as paragraphs with line breaks:<br/>
{{ user_text | nl2br }}
答案 1 :(得分:1)
在Flask中默认打开Jinja的自动视图。任何未明确标记为安全的内容都将被正确转义。
http://flask.pocoo.org/docs/templating/#controlling-autoescaping
答案 2 :(得分:1)
我使用Bleach - http://bleach.readthedocs.org/来删除HTML并只允许通过我想要的标记。它真的很容易使用。