原文:https://www.jianshu.com/p/deddb31ab9fe

没有接触过这门语言,不过像很多类似的例子可供参考,如果不对输入过滤,又恰好满足某些条件,是很有可能由于恶意输入导致程序崩溃,甚至用户信息流失的。
最简单的例子是输出HTML,如果对于某些特殊符号不做转移,很容易就会被恶意脚本攻击了。

我猜想这门语言应该对于特定条件下的输入有自动的过滤(an environment with automatic escaping enabled),如果你标记为safe将会将这些过滤器移除掉,降低安全性,所以如果是对外的API,它们的输入的话,没有充足的理由,不应该标记为safe。

jinja2是模板引擎,我现在就是在学用它来做html模板。我之前的想法是这样的:不转义的话不就当做普通的字符串了么,反而应该是安全的。现在看了您的回答,又搜索了一下,是否是这个意思:html中不转义,它也未必会把输入当成普通字符串,实际上有可能当做js指令。html的转义是将标签等元素映射为对应的其他字符,实现一种过滤,从而避免执行一些用户输入的js代码。


Jinja2默认也开启了转义


不带safe的,将内容原样输出
带safe的,是将内容当做html进行解析。
如果一个内容让用户输入的,一个懂程序的用户恶意写入一个死循环框的js代码,然后你还认为这个safe是安全的,网页直接废掉了。
所以一般我们传递给前段模板的,才有可能使用safe,如果是用户输入的内容,进行显示时肯定不会使用safe,直接原样输出。


拓展阅读:Jinja模板的过滤器

过滤器是通过|符号进行使用的,例如:{{ name|length }}:将返回name的长度。

Jinja2拥有许多过滤器:

abs(value):返回一个数值的绝对值。示例:-1|abs

default(value,default_value,boolean=false):如果当前变量没有值,则会使用参数中的值来代替。
示例:name|default('xiaotuo')
——如果name不存在,则会使用xiaotuo来替代。boolean=False默认是在只有这个变量为undefined的时候才会使用default中的值,如果想使用python的形式判断是否为false,则可以传递boolean=true。也可以使用or来替换。

escape(value)或e:转义字符,会将<、>等符号转义成HTML中的符号。示例:content|escapecontent|e

first(value):返回一个序列的第一个元素。示例:names|first

format(value,*arags,**kwargs):格式化字符串。比如:
{{ "%s" - "%s"|format('Hello?',"Foo!") }}
将输出:Helloo? - Foo!

last(value):返回一个序列的最后一个元素。示例:names|last

length(value):返回一个序列或者字典的长度。示例:names|length

join(value,d=u''):将一个序列用d这个参数的值拼接成字符串。

safe(value):如果开启了全局转义,那么safe过滤器会将变量关掉转义。示例:content_html|safe

int(value):将值转换为int类型。

float(value):将值转换为float类型。

lower(value):将字符串转换为小写。

upper(value):将字符串转换为小写。

replace(value,old,new): 替换将old替换为new的字符串。

truncate(value,length=255,killwords=False):截取length长度的字符串。

striptags(value):删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格。

trim:截取字符串前面和后面的空白字符。

string(value):将变量转换成字符串。

wordcount(s):计算一个长字符串中单词的个数。

关于jinja2的{{...|safe}}过滤器相关推荐

  1. 【Flask】Jinja2模板之过滤器

    一.过滤器定义 实质上就是一个转换函数.变量可以通过"过滤器"进行修改,过滤器可以理解为是jinja2里面的内置函数和字符串处理函数. 常用的过滤器有: 1.字符串过滤器 视图函数 ...

  2. Flask后端笔记(三)Jinja2模板、过滤器、表单、宏、模板继承、包含

    Flask后端笔记 Jinja2模板 基本流程 变量 过滤器 字符串过滤器 支持链式使用过滤器 列表过滤器 自定义过滤器 表单 不使用Flask-WTF扩展时,表单需要自己处理 使用Flask-WTF ...

  3. Web框架——Flask系列之Jinja2自带过滤器(三)

    一.过滤器概述 过滤器的本质就是函数.有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化.运算等等,而在模板中是不能直接调用 Python 中的某些方法,那么这就用到了过滤器. ...

  4. 【Flask】jinja2过滤器的使用

    使用情景- 遇到一个bug:在数据库中存的数据,取出到前端后自带换行,(导致js中的引号.分号直接被换到下一行),js无法正常读取数据.猜测可能是在数据录入的时候输入了什么特殊符号,但是把数据删掉重新 ...

  5. 第十阶段 -- Flask框架03:【Jinja2模板01:模板;过滤器;控制语句if for】

    文章目录 1. Jinja2模板介绍和查找路径 2. 模板传参及其技巧 3. 模板中使用url_for 4. Jinja2过滤器 1. 基本使用 2. 过滤器介绍 3. default详解 4. 常用 ...

  6. Flask_day_2渲染Jinja2模板和传参(if判断、for循环、过滤器、继承和block、URL链接)

    ***Flask渲染Jinja2模板和传参: 1.如何渲染模板 *模板放在'templates'文件夹下 *在'flask'中导入'render_template' *在视频函数中,用'render_ ...

  7. Python之 jinja2模板浅析

    目录 前言 1. jinja2介绍 1.1 jinja2的优点 1.2 安装jinja2 2. jinja2语法 2.1 基本语法 2.2 jinja2变量 2.3 jinja2中的过滤器 3. ji ...

  8. Flask mysql 模版传参_Flask渲染Jinja2模板和传参

    ### Flask渲染Jinja2模板和传参: 1. 如何渲染模板: * 模板放在`templates`文件夹下 * 从`flask`中导入`render_template`函数. * 在视图函数中, ...

  9. Flask框架基础Jinja2模板

    Flask框架基础Jinja2模板-- 潘登同学的flask学习笔记 文章目录 Flask框架基础Jinja2模板-- 潘登同学的flask学习笔记 return 模板 Template 模板的使用 ...

最新文章

  1. WPF基础入门 - 1
  2. 日志库EasyLogging++学习系列(7)—— 记录方式详解
  3. Zookeeper基于Java 访问
  4. python:找出两个列表中相同和不同的元素(使用推导式)
  5. 合格架构师的目标管理
  6. xp系统打开计算机硬盘分区,XP系统下怎么进行硬盘分区啊?
  7. resiprocate 之repro使用
  8. 连接虚机中的mysql服务
  9. 【Django 2021年最新版教程34】python unittest 对函数单元测试 覆盖率检测
  10. win10微信卡顿_电脑一分钟小技巧:win10微信电脑端多开方法
  11. oracle 清理磁盘空间,oracle清理磁盘空间
  12. 【2020年面经】【通用篇】拿了阿里、滴滴、shopee几家公司offer后的经验总结
  13. 设计图片转换html5,在HTML5中翻转图片
  14. seosem是什么意思
  15. 前端技术的发展和趋势
  16. PS2018学习笔记(03-18节)
  17. Linux云计算薪资及发展前景,云计算Linux就业方向及前景分析 2019云计算行业发展现状及前景趋势分析...
  18. C语言编译器,神奇的魔法师
  19. 凸优化学习笔记(一)
  20. 取消UltraEdit查看网页源文件

热门文章

  1. HDU - 4370 0 or 1(思维+最短路)
  2. python3列表_Python3列表
  3. 利用JSP编写程序初步
  4. 木马开机启动的六种方法
  5. STL 之fill和fill_n
  6. MySQL 锁与MVCC :数据库的锁、MVCC、当前读、快照读、锁算法、死锁
  7. Linux 进程(二) 进程地址空间
  8. 斐波那契数拓展问题:leetcode-70 爬楼梯问题 leetcode-1137 泰波那契数问题解法
  9. 抖音xgorgon04参数
  10. 手把手教你拦截Linux系统调用