基于Django的电子商务网站开发(连载38)
- 2019 年 12 月 11 日
- 笔记
新年加入啄木鸟公众号,好运滚滚来!
顾翔老师开发的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