js混淆網站:[https://www.sojson.com/jscodeconfusion.html](https://www.sojson.com/jscodeconfusion.html)
js加密,前端和后端指定同一加密規則
```
$(function () {
$('#sms-captcha-btn').click(function (event) {
event.preventDefault();
var self = $(this);
var telephone = $("input[name='telephone']").val();
if(!(/^1[345789]\d{9}$/.test(telephone))){
zlalert.alertInfoToast("請輸入正確的手機號碼");
return ;
}
var timestamp = (new Date).getTime();
var sign = md5(timestamp+telephone+"A@^JIJw55a7832a@kddad@!&12=");
zlajax.post({
'url':'/c/sms_captcha/',
'data':{
'telephone':telephone,
'timestamp':timestamp,
'sign':sign,
},
'success':function (data) {
// console.log(data)
if (data['code'] == 200) {
zlalert.alertSuccessToast("短信驗證碼發送成功!");
self.attr('disabled', 'disabled');
//倒計時,每隔1秒執行1次
var timeCount = 6;
var timer = setInterval(function () {
timeCount--;
self.text(timeCount);
if (timeCount <= 0) {
self.removeAttr('disabled');
clearInterval(timer);
self.text("發送驗證碼");
}
}, 1000)
}else{
zlalert.alertInfoToast(data["message"]);
}
}
})
})
})
```
```
from apps.forms import BaseForm
from wtforms import StringField
from wtforms.validators import regexp,InputRequired
import hashlib
class SMSCaptchaForm(BaseForm):
salt = "A@^JIJw55a7832a@kddad@!&12="
telephone = StringField(validators=[regexp(r'^1[345789]\d{9}')])
timestamp = StringField(validators=[regexp(r'\d{13}')])
sign = StringField(validators=[InputRequired()])
def validate(self):
result = super(SMSCaptchaForm,self).validate()
if not result:
return False
telephone = self.telephone.data
timestamp = self.timestamp.data
sign = self.sign.data
# md5(timestamp+telephone+salt)
# md5函數必須要傳入一個bytes類型的字符串進去
# 從md5對象中獲取字符串需要調用hexdigest()方法
sign2 = hashlib.md5((timestamp+telephone+self.salt).encode('utf-8')).hexdigest()
print("客戶端提交的",sign)
print("服務器提交的",sign2)
if sign == sign2:
return True
else:
False
```
視圖以post方法重寫
```
@bp.route('/sms_captcha/',methods=['POST'])
def sms_captcha():
# telephone
# timestamp
# md5(ts+telephone+salt)
form = SMSCaptchaForm(request.form)
if form.validate():
telephone = form.telephone.data
captcha = Captcha.gene_text(4)
if demo_sms_send.send_api(telephone,code=captcha):
return restful.success()
else:
return restful.params_error(message="短信驗證碼發送失敗!")
else:
return restful.params_error(message="參數錯誤")
```
由于考慮安全性,需要對js進行混淆
網址:[https://www.sojson.com/jscodeconfusion.html](https://www.sojson.com/jscodeconfusion.html)
混淆后的js文件
一般操作是先加密再混淆
```
window["\x65\x76\x61\x6c"](function(WSPoHOSkF1,Akgo2,L3,vqX4,migsoYcRM5,$gG6){migsoYcRM5=function(L3){return L3['\x74\x6f\x53\x74\x72\x69\x6e\x67'](36)};if('\x30'['\x72\x65\x70\x6c\x61\x63\x65'](0,migsoYcRM5)==0){while(L3--)$gG6[migsoYcRM5(L3)]=vqX4[L3];vqX4=[function(migsoYcRM5){return $gG6[migsoYcRM5]||migsoYcRM5}];migsoYcRM5=function(){return'\x5b\x32\x2d\x35\x37\x38\x61\x62\x65\x2d\x6b\x5d'};L3=1};while(L3--)if(vqX4[L3])WSPoHOSkF1=WSPoHOSkF1['\x72\x65\x70\x6c\x61\x63\x65'](new window["\x52\x65\x67\x45\x78\x70"]('\\\x62'+migsoYcRM5(L3)+'\\\x62','\x67'),vqX4[L3]);return WSPoHOSkF1}('\x24\x28\x35\x28\x29\x7b\x24\x28\'\x23\x73\x6d\x73\x2d\x63\x61\x70\x74\x63\x68\x61\x2d\x62\x74\x6e\'\x29\x2e\x63\x6c\x69\x63\x6b\x28\x35\x28\x68\x29\x7b\x68\x2e\x70\x72\x65\x76\x65\x6e\x74\x44\x65\x66\x61\x75\x6c\x74\x28\x29\x3b\x32 \x34\x3d\x24\x28\x74\x68\x69\x73\x29\x3b\x32 \x33\x3d\x24\x28\x22\x69\x6e\x70\x75\x74\x5b\x6e\x61\x6d\x65\x3d\'\x33\'\x5d\x22\x29\x2e\x76\x61\x6c\x28\x29\x3b\x62\x28\x21\x28\x2f\x5e\x31\x5b\x33\x34\x35\x37\x38\x39\x5d\\\x64\x7b\x39\x7d\x24\x2f\x2e\x74\x65\x73\x74\x28\x33\x29\x29\x29\x7b\x65\x2e\x69\x28\x22\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u624b\u673a\u53f7\u7801\x22\x29\x3b\x72\x65\x74\x75\x72\x6e\x7d\x32 \x37\x3d\x28\x6e\x65\x77 \x44\x61\x74\x65\x29\x2e\x67\x65\x74\x54\x69\x6d\x65\x28\x29\x3b\x32 \x66\x3d\x6d\x64\x35\x28\x37\x2b\x33\x2b\x22\x41\x40\x5e\x4a\x49\x4a\x77\x35\x35\x61\x37\x38\x33\x32\x61\x40\x6b\x64\x64\x61\x64\x40\uff01\x26\x31\x32\x3d\x22\x29\x3b\x7a\x6c\x61\x6a\x61\x78\x2e\x70\x6f\x73\x74\x28\x7b\'\x75\x72\x6c\'\x3a\'\x2f\x63\x2f\x73\x6d\x73\x5f\x63\x61\x70\x74\x63\x68\x61\x2f\'\x2c\'\x38\'\x3a\x7b\'\x33\'\x3a\x33\x2c\'\x37\'\x3a\x37\x2c\'\x66\'\x3a\x66\x2c\x7d\x2c\'\x73\x75\x63\x63\x65\x73\x73\'\x3a\x35\x28\x38\x29\x7b\x62\x28\x38\x5b\'\x63\x6f\x64\x65\'\x5d\x3d\x3d\x32\x30\x30\x29\x7b\x65\x2e\x61\x6c\x65\x72\x74\x53\x75\x63\x63\x65\x73\x73\x54\x6f\x61\x73\x74\x28\x22\u77ed\u4fe1\u9a8c\u8bc1\u7801\u53d1\u9001\u6210\u529f\x21\x22\x29\x3b\x34\x2e\x61\x74\x74\x72\x28\'\x67\'\x2c\'\x67\'\x29\x3b\x32 \x61\x3d\x36\x3b\x32 \x6a\x3d\x73\x65\x74\x49\x6e\x74\x65\x72\x76\x61\x6c\x28\x35\x28\x29\x7b\x61\x2d\x2d\x3b\x34\x2e\x6b\x28\x61\x29\x3b\x62\x28\x61\x3c\x3d\x30\x29\x7b\x34\x2e\x72\x65\x6d\x6f\x76\x65\x41\x74\x74\x72\x28\'\x67\'\x29\x3b\x63\x6c\x65\x61\x72\x49\x6e\x74\x65\x72\x76\x61\x6c\x28\x6a\x29\x3b\x34\x2e\x6b\x28\x22\u53d1\u9001\u9a8c\u8bc1\u7801\x22\x29\x7d\x7d\x2c\x31\x30\x30\x30\x29\x7d\x65\x6c\x73\x65\x7b\x65\x2e\x69\x28\x38\x5b\x22\x6d\x65\x73\x73\x61\x67\x65\x22\x5d\x29\x7d\x7d\x7d\x29\x7d\x29\x7d\x29',[],21,'\x7c\x7c\x76\x61\x72\x7c\x74\x65\x6c\x65\x70\x68\x6f\x6e\x65\x7c\x73\x65\x6c\x66\x7c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x7c\x7c\x74\x69\x6d\x65\x73\x74\x61\x6d\x70\x7c\x64\x61\x74\x61\x7c\x7c\x74\x69\x6d\x65\x43\x6f\x75\x6e\x74\x7c\x69\x66\x7c\x7c\x7c\x7a\x6c\x61\x6c\x65\x72\x74\x7c\x73\x69\x67\x6e\x7c\x64\x69\x73\x61\x62\x6c\x65\x64\x7c\x65\x76\x65\x6e\x74\x7c\x61\x6c\x65\x72\x74\x49\x6e\x66\x6f\x54\x6f\x61\x73\x74\x7c\x74\x69\x6d\x65\x72\x7c\x74\x65\x78\x74'['\x73\x70\x6c\x69\x74']('\x7c'),0,{}))
```
- 介紹
- 1.Flask視圖和URL
- 01 虛擬環境
- 02 URL組成部分詳解
- 03 web服務器+應用服務器+web應用框架
- 04 flask程序詳解
- 05 debug模式詳解
- 06 配置文件兩種方式詳解
- 07 URL中兩種方式傳參
- 08 url_for使用詳解
- 09 自定義URL轉換器
- 10 必會的小細節知識
- 11 重定向詳解
- 12-13 視圖函數Response返回值詳解
- 2.Jinja2模版
- 14 Jinja2模板介紹
- 15 模板傳參及其技巧
- 16 模板中使用url_for
- 17 過濾器基本使用
- 18 default過濾器詳解
- 19 常用過濾器講解
- 20 自定義過濾器
- 21 自定義時間處理過濾器案例
- 22 if
- 23 for循環語句詳解
- 24 九九乘法表
- 25 宏的概念和基本使用
- 26 宏的導入和注意事項
- 27 include標簽使用詳解
- 28 set和with語句以及模板中定義變量
- 29 加載靜態文件
- 30 模板繼承詳解
- 31-36 豆瓣微信小程序案例
- 3.Flask視圖高級
- 37 add_url_rule和app.route原理剖析
- 38 標準類視圖及其使用場景
- 39 基于調度方法的類視圖
- 40 類視圖中使用裝飾器
- 41 藍圖的基本使用
- 42 藍圖中模版文件尋找規則
- 43 藍圖中靜態文件尋找規則
- 44 url_for反轉藍圖注意事項
- 45 子域名實現詳解
- 4.Flask數據庫
- 46 安裝MySQL以及注意事項
- 47 SQLAlchemy連接數據庫
- 48 ORM介紹
- 49 定義ORM模型并將其映射到數據庫中
- 50 SQLAlchemy對數據的增刪改查操作
- 51 SQLAlchemy屬性常用數據類型詳解
- 52 Column常用參數
- 53 query函數可查詢的數據
- 54 filter方法常用過濾條件
- 55 外鍵及其四種約束講解
- 56 ORM層外鍵和一對多關系
- 57 一對一關系實現
- 58 多對多關系實現
- 59 ORM層面刪除數據注意事項
- 60 relationship方法中的cascade參數詳解(1)
- 61 relationship方法中的cascade參數詳解(2)
- 62 三種排序方式詳解
- 63 limit、offset以及切片操作
- 64 數據查詢懶加載技術
- 65 group_by和having子句
- 66 join實現復雜查詢
- 67 subquery實現復雜查詢
- 68 Flask-SQLAlchemy的使用詳解
- 69 alembic數據庫遷移工具基本使用
- 70 alembic常用命令和經典錯誤解決辦法
- 71 Flask-SQLAlchemy下alembic的配置
- 72 Flask-Script詳細講解
- 73 項目結構重構
- 74 Flask-Migrate詳細講解
- 75 Flask-Migrate注意事項
- 5.Flask知識點補充
- WTForms
- 76 WTForms表單驗證基本使用
- 77 WTForms常用驗證器
- 78 自定義表單驗證器
- 79 使用WTForms渲染模版
- 上傳文件
- 80 上傳文件以及訪問上傳的文件
- 81 使用flask_wtf1驗證上傳的文件
- Flask Cookie
- 82 cookie的基本概念
- 83 Flask設置和刪除cookie|Flask設置cookie過期時間|設置Cookie的有效域名
- Flask Session
- 86 session的基本概念
- 87 Flask操作session
- CSRF攻擊與防御
- 88 CSRF攻擊原理
- 89 實戰項目-中國工商銀行注冊功能完成
- 90 實戰項目-中國工商銀行登錄和轉賬實現
- 91 實戰項目-病毒網站使用CSRF漏洞轉賬
- 92 CSRF防御原理
- 93 Flask中CSRF防御的方法與原理
- 94 AJAX處理CSRF漏洞
- Flask 上下文
- 95 Local線程隔離對象
- 96 app上下文和request上下文詳解
- 97 線程隔離的g對象使用詳解
- Flask鉤子函數
- 98 before_request鉤子函數詳解
- 99 context_processor鉤子函數詳解
- 100 errorhandler鉤子函數詳解
- Flask信號
- 101 信號機制及其使用場景詳解
- 102 Flask內置的信號講解
- Flask Restful
- 103 Restful API規范介紹
- 104 Flask-Restful插件的基本使用
- 105 Flask-Restful參數驗證
- 106 Flask-Restful標準化返回參數(1)
- 107 Flask-Restful標準化返回參數(2)
- 108 Flask-Restful細節強化
- 6.memcached緩存系統
- 109 memcached介紹
- 110 memcached的安裝和參數詳解
- 111 telnet操作memcached
- 112 Python操作memcached
- 113 memcached的安全機制
- 7.Redis鍵值對數據庫
- 114 Redis概述和使用場景介紹
- 115 Redis的安裝以及客戶端連接
- 116 Redis的字符串以及過期時間操作
- 117 Redis的列表操作
- 118 Redis的集合操作
- 119 Redis的哈希操作
- 120 Redis的事務操作
- 121 Redis的發布和訂閱操作
- 122 RDB和AOF的兩種數據持久化機制
- 123 Redis設置連接密碼
- 124 其他機器連接本機redis
- 125 Python操作redis
- 8.Flask企業級論壇實戰項目
- Flask項目實戰
- 126.實戰項目介紹
- 127.項目結構搭建
- 128.cms用戶模型定義
- 129.cms后臺登錄界面完成
- 130.cms后臺登錄功能完成
- 131.cms后臺登錄限制
- 132.cms后臺模版渲染完成
- 133.cms用戶名渲染和注銷功能實現
- 134.cms模版抽離和個人信息頁面完成
- 135.cms登錄頁面CSRF保護
- 136.cms后臺修改密碼界面布局完成
- 137.cms后臺修改密碼ajax功能完成
- 138.cms后臺密碼修改服務器邏輯完成
- 139.優化json數據的返回
- 140.sweetalert提示框用法講解
- 141.sweetalert優化修改密碼結果反饋
- 142.修改郵箱界面完成
- 143.Flask-Mail的使用以及郵箱配置
- 144.發送郵箱驗證碼功能完成
- 145.修改郵箱功能完成
- 146.二進制及其相關運算
- 147.權限和角色模型定義
- 148.封裝權限判斷功能
- 149.客戶端權限驗證功能完成
- 150.服務端權限驗證功能完成
- 151.前臺用戶模型創建(1)
- 152.前臺用戶模型創建(2)
- 153.注冊界面完成
- 154.圖形驗證碼生成技術詳解
- 155.點擊更換圖形驗證碼
- 156.發送短信驗證碼
- 157注冊頁面對接短信驗證碼接口
- 158.短信驗證碼接口加密和js代碼混淆
- 159.緩存驗證碼
- 160.注冊功能前端邏輯代碼完成
- 161.注冊功能后臺邏輯代碼完成
- 162.注冊完成跳轉回上一個頁面
- 163.登錄界面完成
- 164.登錄功能完成
- 165.首頁導航條實現和代碼抽離
- 166.首頁輪播圖實現
- 167.cms輪播圖管理頁面布局
- 168.cms添加輪播圖的模態對話框制作
- 169.cms添加輪播圖后臺邏輯代碼完成
- 170.cms添加輪播圖前臺邏輯代碼完成
- 171.cms編輯和刪除輪播圖功能完成
- 172.七牛云存儲介紹
- 173.七牛JS和Python的SDK使用
- 174.輪播圖上傳圖片功能完成
- 175.首頁動態獲取輪播圖數據
- 176.板塊管理(1)
- 177.板塊管理(2)
- 178.UEditor編輯器集成以及配置上傳文件到七牛
- 179.發布帖子后臺邏輯完成
- 180.發布帖子界面布局完成
- 181.發布帖子前端邏輯代碼完成
- 182.首頁帖子列表布局完成
- 183.帖子分頁技術實現
- 184.帖子板塊過濾顯示
- 185.帖子詳情頁布局
- 186.評論布局和功能實現(1)
- 187.評論布局和功能實現(2)
- 188.帖子加精和取消加精功能完成
- 189.帖子按照發布時間和評論數量等排序
- 190.celery實現異步任務
- 191.Flask+Celery實現郵件和短信異步發送
- ajax技術
- 192.Flask和Ajax技術
- 9.Python web開發核心技術
- 部署
- 193.開發機上的準備工作
- 194.服務器安裝Python和虛擬環境
- 195.服務器安裝ssh、git以及mysql
- 196.生產環境下項目的配置
- 197.uWSGI部署項目
- 198.uWSGI配置文件
- 199.nginx+uwsgi部署項目
- 200.supervisor管理uwsgi進程