为什么“千万不要对未知的变量使用safe过滤器”?
Jinja2文档里说:
safe(value)
Mark the value as safe which means that in an environment with automatic escaping enabled this variable will not be escaped.
那么就是说未知变量,如果使用了safe过滤器,然后就不会转义,就有安全隐患。请问会造成什么样的隐患呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
没有接触过这门语言,不过像很多类似的例子可供参考,如果不对输入过滤,又恰好满足某些条件,是很有可能由于恶意输入导致程序崩溃,甚至用户信息流失的。
最简单的例子是输出HTML,如果对于某些特殊符号不做转移,很容易就会被恶意脚本攻击了。
我猜想这门语言应该对于特定条件下的输入有自动的过滤(an environment with automatic escaping enabled),如果你标记为safe将会将这些过滤器移除掉,降低安全性,所以如果是对外的API,它们的输入的话,没有充足的理由,不应该标记为safe。
比如
html中就会输出特大号的密码...
WHY?
因为jinja2本质上是code generator, {{ var }} 会被python执行的.
所以输入需要转义, Jinja2默认也开启了转移.
不带safe的,将内容原样输出
带safe的,是将内容当做html进行解析。
如果一个内容让用户输入的,一个懂程序的用户恶意写入一个死循环框的js代码,然后你还认为这个safe是安全的,网页直接废掉了。
所以一般我们传递给前段模板的,才有可能使用safe,如果是用户输入的内容,进行显示时肯定不会使用safe,直接原样输出。