前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于Django的电子商务网站开发(连载38)

基于Django的电子商务网站开发(连载38)

作者头像
顾翔
发布2019-12-11 17:27:07
2850
发布2019-12-11 17:27:07
举报
文章被收录于专栏:啄木鸟软件测试

新年加入啄木鸟公众号,好运滚滚來!

顾翔老师开发的bugreport2script开源了,希望大家多提建议。文件在https://github.com/xianggu625/bug2testscript,

主文件是:zentao.py 。bugreport是禅道,script是python3+selenium 3,按照规则在禅道上书写的bugreport可由zentao.py程序生成py测试脚本。

4.2.4 针对CSRF防御接口测试代码的调整

为了适应增加对CSRF的防御功能,必须对测试代码进行调整,由于前面对代码进行了很好的封装,所以在这里只需要调整interface/util.py中Util类中的run_test()方法就可以了。在这里先把改造后的代码展示给大家。

...#运行测试接口 # mylist测试数据 # values登录数据 def run_test(self,mylist,values,sign): #获取测试URL Login_url = self.url+"/login_action/" #login_Url为登录的URL run_url = mylist["Url"] #run_url为运行测试用例所需的URL #获取csrf_token data = self.s.get(Login_url) csrf_token = data.cookies["csrftoken"] #初始化登录变量 #获取登录数据 username = values.split(',')[1].strip("\"") password = values.split(',')[2].strip("\"") #判断当前测试是否需要登录 if sign: #使用当前用户登录系统payload ={"username":username,"password":password,"csrfmiddlewaretoken":csrf_token} try: data = self.s.post(Login_url,data=payload) except Exception as e: print(e) #运行测试接口 try: #为POST请求,由于post请求参数肯定是存在的,所以这里不判断有无参数 if mylist["Method"] == "post": #有请求参数 payload = eval(mylist["InptArg"]) payload["csrfmiddlewaretoken"] = csrf_token data = self.s.post(run_url,data=payload) #为GET请求 elif mylist["Method"] == "get": if mylist["InptArg"].strip()=="": #没有请求参数 data = self.s.get(run_url) else: #有请求参数 payload = eval(mylist["InptArg"]) data = self.s.get(run_url,params=payload) except Exception as e: print(e) else: return data...

#运行测试接口 # mylist测试数据 # values登录数据 def run_test(self,mylist,values,sign): #获取测试URL Login_url = self.url+"/login_action/" #login_Url为登录的URL run_url = mylist["Url"] #run_url为运行测试用例所需的URL #获取csrf_token data = self.s.get(Login_url) csrf_token = data.cookies["csrftoken"] #初始化登录变量 #获取登录数据 username = values.split(',')[1].strip("\"") password = values.split(',')[2].strip("\"") #判断当前测试是否需要登录 if sign: #使用当前用户登录系统payload ={"username":username,"password":password,"csrfmiddlewaretoken":csrf_token} try: data = self.s.post(Login_url,data=payload) except Exception as e: print(e) #运行测试接口 try: #为POST请求,由于post请求参数肯定是存在的,所以这里不判断有无参数 if mylist["Method"] == "post": #有请求参数 payload = eval(mylist["InptArg"]) payload["csrfmiddlewaretoken"] = csrf_token data = self.s.post(run_url,data=payload) #为GET请求 elif mylist["Method"] == "get": if mylist["InptArg"].strip()=="": #没有请求参数 data = self.s.get(run_url) else: #有请求参数 payload = eval(mylist["InptArg"]) data = self.s.get(run_url,params=payload) except Exception as e: print(e) else: return data...

#运行测试接口 # mylist测试数据 # values登录数据 def run_test(self,mylist,values,sign): #获取测试URL Login_url = self.url+"/login_action/" #login_Url为登录的URL run_url = mylist["Url"] #run_url为运行测试用例所需的URL #获取csrf_token data = self.s.get(Login_url) csrf_token = data.cookies["csrftoken"] #初始化登录变量 #获取登录数据 username = values.split(',')[1].strip("\"") password = values.split(',')[2].strip("\"") #判断当前测试是否需要登录 if sign: #使用当前用户登录系统payload ={"username":username,"password":password,"csrfmiddlewaretoken":csrf_token} try: data = self.s.post(Login_url,data=payload) except Exception as e: print(e) #运行测试接口 try: #为POST请求,由于post请求参数肯定是存在的,所以这里不判断有无参数 if mylist["Method"] == "post": #有请求参数 payload = eval(mylist["InptArg"]) payload["csrfmiddlewaretoken"] = csrf_token data = self.s.post(run_url,data=payload) #为GET请求 elif mylist["Method"] == "get": if mylist["InptArg"].strip()=="": #没有请求参数 data = self.s.get(run_url) else: #有请求参数 payload = eval(mylist["InptArg"]) data = self.s.get(run_url,params=payload) except Exception as e: print(e) else: return data...

(1)首先通过代码data =self.s.get(Login_url)访问登录页面。

(2)通过代码csrf_token= data.cookies["csrftoken"]获取产生的CSRF令牌cookie。

(3) 在初始化登录操作与执行POST操作的时候把令牌参数csrf_token加入到POST参数中。

在初始化登录操作中代码为。

...#使用当前用户登录系统payload ={"username":username,"password":password,"csrfmiddlewaretoken":csrf_token}try: data = self.s.post(Login_url,data=payload)...

执行post操作中代码为。

...#为POST请求,由于post请求参数肯定是存在的,所以这里不判断有无参数if mylist["Method"] == "post":#有请求参数payload = eval(mylist["InptArg"])payload["csrfmiddlewaretoken"] = csrf_tokendata = self.s.post(run_url,data=payload)...

在userInfoConfig.xml中增加一个测试用例,测试不加载csrftoken,程序会不会产生403返回码并且返回的text中含有Forbidden字符。

... <!--- 测试CSRF不启用,返回403码 --> <case> <TestId>userInfo-testcase006</TestId> <Title>修改用户密码</Title> <Method>post</Method> <Desc>密码修改成功</Desc> <Url>http://127.0.0.1:8000/change_password/</Url> <InptArg>{"oldpassword":"000000","newpassword":"123456","checkpassword":"123456"}</InptArg><!--- 新密码与旧密码不同,确认密码与新密码匹配 --> <Result>403</Result> <CheckWord>Forbidden</CheckWord> </case>...

在interface/util.py中的run_test()还要进行小小地改动。

... def run_test(self,mylist,values,sign): ... #运行测试接口 try: #为POST请求,由于post请求参数肯定是存在的,所以这里不判断有无参数 if mylist["Method"] == "post": payload = eval(mylist["InptArg"]) #如果不是测试CSRF的 if mylist["Result"]!="403": payload["csrfmiddlewaretoken"]= csrf_token data = self.s.post(run_url,data=payload)...

在这里判断测试验证返回码如果是403,就在请求参数中不加入csrfmiddlewaretoken项。

星云测试

http://www.teststars.cc

奇林软件

http://www.kylinpet.com

联合通测

http://www.quicktesting.net

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 4.2.4 针对CSRF防御接口测试代码的调整
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档