Flask 数据传输加密
1、先创建一个库并添加、查询
建一个新的表
视图
@blue.route("/addnews/")
def add_news():
news = News()
time = datetime.datetime.now()
news.n_title = "今日全国新增892例"
news.n_content = "截止今日(%s)全国确诊总人数75571" % time.date()
db.session.add(news)
db.session.commit()
return "添加新闻成功"
@blue.route("/getnews/")
def get_news():
news_list = News.query.all()
return render_template("NewsList.html", news_list=news_list)
新建App/templates/NewsList.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>最新消息</h2>
<ul>
{% for news in news_list %}
<li>{{ news.n_title }}</li>
<li>{{ news.n_content }}</li>
{% endfor %}
</ul>
</body>
</html>
迁移
python manage.py db migrate
python manage.py db upgrade
运行
python manage.py runserver -r -d
访问
2、反爬策略:数据加密、js动态加载
2.1、先把数据变成js加载
新建news_content.html
把下图这部分代码移到news_content.html中
修改视图
修改NewsList.html
运行并访问
2.2、对news_content进行base64加密
视图
@blue.route("/jiami/")
def jiami():
news_list = News.query.all()
news_content = render_template("news_content.html", news_list=news_list)
# decode("utf-8")的作用是将utf-8转换成unicode编码
# encode("utf-8")的作用是将unicode编码转换成utf-8
# 第一次加密
encode_1 = base64.standard_b64encode(news_content.encode("utf-8")).decode("utf-8")
# 添加混淆字符
add_encode_1 = "ComeonWuhan" + encode_1 + "ComeonChina"
# 第二次加密
encode_2 = base64.standard_b64encode(add_encode_1.encode("utf-8")).decode("utf-8")
return render_template("NewsList.html", news_content=news_content, encode_2=encode_2)
NewsList.html
新建static/js/base64_decode.js 内容如下
var Base64 = {
_keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
decode: function (e) {
var t = "";
var n, r, i;
var s, o, u, a;
var f = 0;
e = e.replace(/[^A-Za-z0-9+/=]/g, "");
while (f < e.length) {
s = this._keyStr.indexOf(e.charAt(f++));
o = this._keyStr.indexOf(e.charAt(f++));
u = this._keyStr.indexOf(e.charAt(f++));
a = this._keyStr.indexOf(e.charAt(f++));
n = s << 2 | o >> 4;
r = (o & 15) << 4 | u >> 2;
i = (u & 3) << 6 | a;
t = t + String.fromCharCode(n);
if (u != 64) {
t = t + String.fromCharCode(r)
}
if (a != 64) {
t = t + String.fromCharCode(i)
}
}
t = Base64._utf8_decode(t);
return t
},
_utf8_decode: function (e) {
var t = "";
var n = 0;
var r = c1 = c2 = 0;
while (n < e.length) {
r = e.charCodeAt(n);
if (r < 128) {
t += String.fromCharCode(r);
n++
} else if (r > 191 && r < 224) {
c2 = e.charCodeAt(n + 1);
t += String.fromCharCode((r & 31) << 6 | c2 & 63);
n += 2
} else {
c2 = e.charCodeAt(n + 1);
c3 = e.charCodeAt(n + 2);
t += String.fromCharCode((r & 15) << 12 | (c2 & 63) << 6 | c3 & 63);
n += 3
}
}
return t
},
};
function loop(e){
return Base64.decode((Base64.decode(e)
["\x72\x65\x70\x6c\x61\x63\x65"](/\x43\x6f\x6d\x65\x6f\x6e\x57\x75\x68\x61\x6e/,"")
["\x72\x65\x70\x6c\x61\x63\x65"](/\x43\x6f\x6d\x65\x6f\x6e\x43\x68\x69\x6e\x61/,"")))
}
/*
\x72\x65\x70\x6c\x61\x63\x65 replace的16进制
\x43\x6f\x6d\x65\x6f\x6e\x57\x75\x68\x61\x6e ComeonWuhan的16进制
\x43\x6f\x6d\x65\x6f\x6e\x43\x68\x69\x6e\x61 ComeonChina的16进制
这里用16进制更容易混淆爬取代码的人,
ComeonWuhan ComeonChina是用来混淆代码用的。
*/
运行并访问
访问之前先清空一下浏览器的缓存,每次有js更改的地方建议都清除一下缓存,不然有可能不能更新js。
访问:这是成功经过base64加密并用字符串混淆后,再经过js解密过来的字符
2.3、爬取看看能获取什么数据
写一个爬虫爬取试试
没有安装requests可以先安装一下
pip install requests
import requests
def get_html():
respose = requests.get('http://127.0.0.1:5000/jiami/')
print(respose.content.decode("utf-8"))
if __name__ == "__main__":
get_html()
爬取后,我们发现只能获取加密后的字符
虽然爬取不到直接的数据,但是我们的解密文件base64_decode.js是能被人获取到的
2.4、隐藏js
写一个能获取js的路由
@blue.route("/getjs/")
def getjs():
with open(os.path.join(BASE_DIR,"App/static/js/base64_decode.js"),"r", encoding='UTF-8') as file:
js = file.read()
return js
这里的os、BASE_DIR两个导包注意一下
修改html
清空浏览器缓存
运行并访问试试
右击/getjs/
我们发现也能打开js
我们将js的加载也变成动态的
修改html
<script type="text/javascript">
document.write('<script type="text/javascript" src="/getjs/?t='+ Date.parse(new Date()) +'"><\/script>');
</script>
修改视图
@blue.route("/getjs/")
def getjs():
t = request.args.get('t')
c = time.time() * 1000
try:
t = int(t)
except:
return "别改了,改了也获取不了我的js"
if c > t and c - t < 1000:
with open(os.path.join(BASE_DIR, "App/static/js/base64_decode.js"), "r", encoding='UTF-8') as file:
js = file.read()
return js
else:
return "想抓取我js,没门"
运行并访问试试
获取js
用爬虫爬取试试
只能获取到加密后字符
2.4.1、番外:爬取这类加密的小技巧
首先我们访问类网站是会看到js里面对应的解密方法
这里这个方法叫loop()
在控制台,输入loop
点进去就能看见js代码