ssti--flask模块

一、flask模板的概念

是一个使用python编写的轻量级web应用框架,使用jinjia模板引擎来渲染html页面,可以直接用flask。

模板的作用是使用静态的页面html展示动态的内容。模板其实是一个响应文本的文件,其中变量表示动态部分,告诉模板引擎具体的值需要从使用的数据中获取,使用真实值替换变量,得到字符串的过程被称为渲染。

二、flask基础知识

1.特点:良好的文档,丰富的插件,包含开发服务器和调试器,集成支持单元测试,RESTful请求调度、支持安全cookie,基于Unicode启动一个web服务页面。

2.使用flask构造网站

基础构造

from flask import Flask   #flask模块中导入flask主键
app = Flask(__name__)  #__name__是系统遍历,指该文件的文件名
@app.route('/aaa')  ##定义路由 ,/aaa表示访问网页时后面携带的路径,也就是说要想执行如下内容,在访问url时需要访问127.0.0.1:5000/aaa
def hello():
    return "hello word"

if __name__=='__main__':  ##表示程序直接运行时,运行下面的语句
    app.run()   

这里的run()中有host、port、debug三个参数,其中host=0.0.0.0表示监听任意接口,debug=True表示python出错时他会给我们报错,定位出错在哪,并且在修改文件后文件会自己重启,只能在开发时使用。port=90参数可以修改端口,但是换需要自己手动重启,上面代码的执行效果如下。

 传参型,

动态变量方式:

from flask import Flask  
app = Flask(__name__)  
@app.route('/bbb/<name>')  ##name为我们的变量,浏览器会把<name>的部分传入函数中,也就是说name是可变的
def aaa(name):
    return "hello %s" % name  #%s表示只能传入字符型
@app.route('/int/<int:postID>')
def id(postID):
    return "%d" % postID  ##%d表示只能传入整型,%f表示浮点型
if __name__=='__main__':  
    app.run()   

 http方法:

方法 描述
get 以未加密的方式将数据发送到服务器
head 和get方式相同,但是没有响应头
post 用于将表单数据发送到服务器,post方法接收的数据不由服务器缓存
put

用上传的内容替换目标资源的所有当前表示

delete 删除由url给出的目标资源的所有当前表示

可以创建一个外部文件,文件内容为post或get传参的html代码。然后使用render_template()函数将文件引用进来。创建项目时,主文件也就是flask模块文件需要放在外部文件的同级目录下的templates目录下。

html页面代码如下

<html>
<body>
<form action = "http://127.0.0.1:5000/login" method="POST">
    <p>enter name:</p>
    <p><input type="text" name="ben"/></p>
    <p><input type="submit" name="submit"/></p>
</form>   
</body>
</html>

 app.py网页传参代码如下

from flask import Flask,redirect,url_for,request,render_template
app=Flask(__name__)

@app.route('/')
def index():
    return render_template("index.html")  #加载index.html页面 

@app.route('/success/<name>')  ##显示welcome对应名字
def success(name):
    return 'welcome %s' %name

@app.route('/login',methods=['POST','GET'])#通过post或get方法提交数据
def login():
    if request.method=='POST': #如果时post传输
        print(1)
        user=request.form['ben']
        return redirect(url_for('success',name = user))  #redirect重定向,将user的值复制给name,页面返回为success界面
    else:
        print(2)
        user=request.args.get('ben')
        return redirect(url_for('success',name = user))
    
if __name__=="__main__":
    app.run()

 传参操作

3、函数介绍

render_template:加载(渲染)html文件。默认文件路径在templates目录下,当你进入127.0.0.1:5000时,它呈现的页面是index.html的内容

例:a.py

from flask import Flask,render_template,request
app = Flask(__name__)
@app.route('/')
def index():
    my_str = 'Hello benben!'
    my_int = request.args.get('min')
    my_array = [5,2,0, 1,3,1,4]
    my_dict = {'name':'dazhuang',
               'age': 18}
    return render_template('index.html',  ##render_template方法:渲染模板,参数1:模板名称为index.html,参数n:传入模板的数据
                          my_str=my_str,
                          my_int=my_int,
                          my_Larray=my_array,
                          my_dict=my_dict)
if __name__=='__main__':
    app.run()

 index.html,显示my_str变量的值,{ {}}调用变量,{%set  变量=  %}用于设置一个值

<html>
<body>
{
  {my_str}} <br> 
{
  {my_int}} <br>
{% set a='minminmin'%} {
  {a}}
</body>
</html>

运行结果

 render_template_string:用于渲染字符串,直接定义内容。

 例:b.py

from flask import Flask,render_template_string,request
app = Flask(__name__)
@app.route('/',methods=['GET'])
def index():
    my_str = 'Hello benben!'
    my_int = request.args.get('min')
    my_array = [5,2,0, 1,3,1,4]
    my_dict = {'name':'dazhuang',
               'age': 18}
    return render_template_string('<html lang="en"><head><meta charset="UTF-8"><title>123</title></head><body>模板展示<br>%s<br>%s</body></html>' %(my_str,my_int))
if __name__=='__main__':
    app.run()

三、注入形成原因

程序员使用jinjia语言渲染引擎进行网页渲染时,因处理不当,未进行语句过滤,用户输入{ {}}控制语句导致渲染出恶意代码形成注入。攻击者可以通过该注入点获取系统中需要的信息。

查找注入点,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值