web开发中很多东西由前段来负责判断,比如常见的邮箱 电话号码,前端判断到不是一个正确的格式,在你点击提交时候提示你格式填错了,然后不请求后端php,直到你填写正确的格式为止。这种其实可以修改js或者干脆用python里面的requests之类的http请求库直接请求接口,那么可以成功把错误的东西提交给后端进而存储到数据库了,那么这种就不太好了。
如果系统不重要,用的人不多,可以勉强放过这一点。
但有的很重要的系统,尤其涉及到金钱的接口,后端必须也做好验证。否则有人利用漏洞来破坏规则,造成金钱的损失和错误。
举个例子,以下是一个对运单费用的修改,系统的业务需求是在运单创建但还没被调度这段时间,这个费用可以修改的,如果运单是已调度状态,则不允许修改这个费用。
系统实现这个是前端按照php的返回,判断一个运单的状态是已调度状态,就用js把这个输入框设置为disabled,此时正常用浏览器是这个输入框输入不了任何东西,但如果懂点前端的,可以用f12定位到元素,把disabled去掉,这样就可以修改费用了。
或者用浏览器对点击保存这个按钮抓个包,用requests按照抓包得到的接口和参数的格式请求php接口,你可以把相关字段的费用数字修改成别的,这样就能绕过前端对你的限制了。
抓包得到的是一个base64格式的,很容易看出特点来是个base64。把这段抓到的base64解码后就可以看到一个明文json了,对这个json修改数字后再用base64加密,再请求接口就可以成功修改费用了。
抓包得到参数:
eyJvcEZyb20iOiIxIiwidXNlck5hbWUiOiJhZG1pbiIsInBzZF92IjoiMyIsInN1cHBsaWVyQ29tcGFueSI6IjUxIiwicHJlZGljdEFycml2ZURhdGUiOiIyMDE2LTEwLTIwIiwiZHJpdmVySUQiOiIzMiIsInZlaGljbGVJRCI6IjE0IiwiZGlzcGF0Y2hOTyI6Iuiwg+W6puWPt+W+iOmVv+W+iOW+iOmVv+eahGFhYWExMTExMTEiLCJkaXNwYXRjaENoYXJnZXMiOiI1LjAwIiwicGFja0NoYXJnZXMiOiIwLjAwIiwiaGFuZGxpbmdDaGFyZ2VzIjoiMi4yMiIsImZvcmtsaWZ0Q2hhcmdlcyI6IjAuMDAiLCJvdGhlckNoYXJnZXMiOiI0LjQ0Iiwic2V0dGxlVHlwZSI6IjMiLCJzZXR0bGVTdGF0dXMiOiIwIiwiZGlzcGF0Y2hUb3RhbENoYXJnZXMiOiIxMS42NiIsInBhaWREaXNwYXRjaFRvdGFsQ2hhcmdlcyI6IjYuNjYiLCJyZWNlaXZhYmxlS2lja2JhY2siOiI5Ljk5IiwicGFpZEtpY2tiYWNrIjoiOC4wMCIsInNldHRsZXIiOiIxIiwicmVtYXJrIjoi5aSH5rOo5LiL5ZOIIiwibWV0aG9kIjoibW9kaWZ5X2Rpc3BhdGNoIiwid2F5YmlsbElEIjoiMTEyOSJ9
base64解码后得到的参数(假设为value):
{"opFrom":"1","userName":"admin","psd_v":"3","supplierCompany":"51","predictArriveDate":"2016-10-20","driverID":"32","vehicleID":"14","dispatchNO":"调度号很长很很长的aaaa111111","dispatchCharges":"5.00","packCharges":"0.00","handlingCharges":"2.22","forkliftCharges":"0.00","otherCharges":"4.44","settleType":"3","settleStatus":"0","dispatchTotalCharges":"11.66","paidDispatchTotalCharges":"6.66","receivableKickback":"9.99","paidKickback":"8.00","settler":"1","remark":"备注下哈","method":"modify_dispatch","waybillID":"1129"}
python代码
import requests,base64
print requests.psot(url,data=base64.b64encode(value)).content
可以看到返回errcode 0,说明成功了,再去网页看下这个运单,结果费用也可以看到是被修改了。
这样最后在月度统计费用时候,会造成错误。