這些寫的很好了,懶得自己寫了,就看吧
https://blog.csdn.net/weixin_41603028/article/details/107865253
https://www.cnblogs.com/hackxf/p/10480071.html
"模板"初步
PHP中很少有模板
在之前PHP的學(xué)習(xí)中,很少遇到模板的概念,因為PHP是一個腳本語言,可以寫在HTML里,對于html需要和后端交互的內(nèi)容直接處理。
比如這樣:
對于前端表單上傳的文件,底下的PHP腳本直接對其進(jìn)行處理(并可能進(jìn)行存儲)。
python模板(以flask為例)
但是python就不一樣了,它不能寫在html中。要通過python web制造交互效果,一般是通過模板(框架)實現(xiàn)。python框架一般是一個庫,可以從前端表單中接收處理數(shù)據(jù),并且通過調(diào)用函數(shù)對前端進(jìn)行渲染。相應(yīng)的,在前端的html中,需要使用一些控制語句,功能語句來支持渲染。
像這樣:
有很多顯眼的控制語句;【{% xxxx %}】
這里面也有功能語句,img src里的{{ url_for('static',filename='img/cover.jpeg') }}
" 這個就是。url_for是一個python_flask里的函數(shù);具體以后再講。
Python_flask初步
一個樣例
給出一個最基礎(chǔ)的、安全的flask小程序。
app.run()運行該web項目;參數(shù)可以填套接字;如果不填,默認(rèn)127.0.0.1:5000.
再次強調(diào),如果要出網(wǎng)(你有一個公網(wǎng)ip),記得不要填公網(wǎng)ip,而是填本地任意地址0.0.0.0 。
app是一個裝飾器;@app.route('xxx')后一定要跟一個函數(shù),它的作用是將函數(shù)內(nèi)容和參數(shù)url綁定。裝飾器 可以理解為 裝飾某個url對應(yīng)的網(wǎng)頁。它必須有返回值,必須為一個渲染的模板 或 字符串。
render_template系列函數(shù)負(fù)責(zé)具體的渲染。小程序中的render_template_string直接使用字符串template渲染網(wǎng)頁根目錄【/】,并且將用戶可控的參數(shù)在函數(shù)中傳入。如果我們不是把要渲染的東西寫在一個python字符串中,而是將其寫成了單獨的帶控制、功能語句的html,那么,我們就要使用render_template函數(shù)。像這樣:
return render_template('search.html', genres = genres)
獲取參數(shù)
python_flask提供三類參數(shù)獲取方法:
request.form,request.args,request.value
查閱資料時,許多內(nèi)容的經(jīng)常提到“表單”這個詞;但我覺得他們說得“表單”的定義非常模糊,此處反而不利于區(qū)分這些方法。
我先將他們與PHP中的全局變量對應(yīng)理解:
request.args.get('xxx')====>$_GET['xxx']
request.form.get('xxx')====>$_POST['xxx']
request.value.get('xxx')====>$_REQUEST['xxx']
SSTI漏洞
給出一個基礎(chǔ)的,不安全的flask小程序:
from flask import Flask,request,render_template_string
app=Flask(__name__)
@app.route('/',methods={"POST","GET"})
def hello_world():
person='who?'
if request.values.get("name"):
person=request.values.get("name")
template='<h1>Hi, %s</h1>' %person
return render_template_string(template)
if __name__=='__main__':
app.run()
用格式化字符串拼接參數(shù)的后果就是,用戶可以通過輸入{{}}進(jìn)行命令執(zhí)行。
本文摘自 :https://www.cnblogs.com/