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

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

作者头像
顾翔
发布2019-12-11 17:55:08
3480
发布2019-12-11 17:55:08
举报

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

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

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

4.3权限操作的漏洞

试想一下,如果一个名为Linda的用户,登录的系统,它可以通过http://127.0.0.1:8000/update_address/1306/2/修改他的收货地址信息,另一位名为Jerry的用户,登录系统后在浏览器地址栏中直接输入http://127.0.0.1:8000/update_address/1306/2/也可以修改这条记录。这就产生了一个安全缺陷,解决这个缺陷的方法是在修改之前先来判断这个收货地址信息是否属于这个登录用户,如果不是抛出异常信息,不进行相应的操作。在goods/util.py中加上如下代码。

...#通过addressId判断这个地址是否属于当前登录用户 def check_User_By_Address(self,request,username,addressId): #获取addressId对应的address信息 address = get_object_or_404(Address,id=addressId) #通过username获取对应的user信息 user = get_object_or_404(User,username=username) #判断addressId对应的userid与username获取对应的userid是否相等 if address.user_id ==user.id: return 1 else: return 0...

然后修改view.py中的方法update_address()。

...def update_address(request,address_id,sign): util = Util() username = util.check_user(request) if username=="": uf = LoginForm() return render(request,"index.html",{'uf':uf,"error":"请登录后再进入"}) else: #判断修改的地址是否属于当前登录用户 if not util.check_User_By_Address(request,username,address_id): return render(request,"error.html",{"error":"你试图修改不属于你的地址信息!"}) else: #获取指定地址信息 address_list = get_object_or_404(Address, id=address_id)...

见粗体字部分。在这里建立一个模板,error.html。

{% extends "base.html" %}{% block content %} <ul class="nav navbar-nav navbar-right"> <li><a href="/user_info/">{{user}}</a></li> <li><a href="/logout/">退出</a></li> </ul> </div><!--/.nav-collapse --> </div> </nav> <div style="margin-top:30px"> <div> <div> </div><!-- /input-group --> </div><!-- /.col-lg-6 --> </div><!-- /.row --> <div class="container theme-showcase" role="main"> <font color="#FF0000">{{error}}</font> </div> <!-- /container glyphicon glyphicon-phone border-style:none; -->{% endblock %}

如图4-2所示。

图4-2 出错信息提示

对于收货地址的删除操作也加上如下代码。

...def delete_address(request,address_id,sign): util = Util() username = util.check_user(request) if username=="": uf = LoginForm() return render(request,"index.html",{'uf':uf,"error":"请登录后再进入"}) else: if not util.check_User_By_Address(request,username,address_id): return render(request,"error.html",{"error":"你试图删除不属于你的地址信息!"}) else:...

在这里可以在addressConfig.xml,加上两条测试数据,分别测试“试图修改不属于自己地址信息”和“试图删除不属于自己地址信息”。

... <!--- 试图修改一个不属于自己的地址 --> <case> <TestId>address-testcase006</TestId> <Title>地址信息</Title> <Method>post</Method> <Desc>试图修改一个不属于自己的地址</Desc> <Url>http://127.0.0.1:8000/update_address/100/1/</Url><!--- “100”作为测试程序地址id插入数据库表中 --> <InptArg>{"address":"上海市延安中路100号","phone":"13681166561"}</InptArg> <Result>200</Result> <CheckWord>你试图</CheckWord><!--- 检查试图修改不属于自己地址信息有无得逞 --> </case> <!--- 试图删除不属于自己地址信息 --> <case> <TestId>address-testcase007</TestId> <Title>地址信息</Title> <Method>get</Method> <Desc>删除地址信息</Desc> <Url>http://127.0.0.1:8000/delete_address/100/1/</Url><!--- “100”作为测试程序地址id插入数据库表中 --> <InptArg></InptArg> <Result>200</Result> <CheckWord>你试图</CheckWord><!--- 检查试图删除不属于自己地址信息有无得逞 --> </case>...

然后再改造测试程序addressTest.py。

... #初始化非法操作信息 self.myuservalue = "" self.addressvalues = "" #开始测试 def test_address_info(self):... #对于非法操作进行的测试 if ("你试图" in mylist["CheckWord"]): #建立用户信息 self.myuservalue = "1,\"121\",\"123456\",\"12345@126.com\"" #建立用户信息与上面和用户关联的地址信息,id从mylist["Url"]中获取 id = (mylist["Url"]).split("/")[4] address= "淮海中路" self.addressvalues = id+",'"+address+"','13666666666',1" #建立一个用户 self.util.insertTable(self.dataBase,self.userTable,self.myuservalue) #建立一个地址 self.util.insertTable(self.dataBase,self.addressTable,self.addressvalues)...def tearDown(self): #对于非法操作进行时候处理 self.util.tearDown(self.dataBase,self.userTable,self.myuservalue) self.util.tearDown(self.dataBase,self.addressTable,self.addressvalues) #清除其他初始化信息......

在删除单个订单、删除总订单里面也会出现这样的问题。首先在goods/util.py中加上如下代码。

...#通过orderId判断这个订单是否属于当前登录用户 def check_User_By_Order(self,request,username,orderId): #获取orderId对应的order信息 order = get_object_or_404(Order,id=orderId) #通过username获取对应的user信息 user = get_object_or_404(User,username=username) #判断addressId对应的userid与username获取对应的userid是否相等 if order.user_id ==user.id: return 1 else: return 0 #通过ordersId判断这个地址是否属于当前登录用户 def check_User_By_Orders(self,request,username,orderId): #获取orderId对应的orders信息 orders = get_object_or_404(Orders,id=orderId) #获取orders.id对应的order信息 order = Order.objects.filter(order_id=orders.id) #通过username获取对应的user信息 user = get_object_or_404(User,username=username) #判断addressId对应的userid与username获取对应的userid是否相等 if len(order)>0: if order[0].user_id == user.id: return 1 else: return 0...

然后改造下产品代码views.py中的delete_orders()方法。

...def delete_orders(request,orders_id,sign): #如果删除单独一个订单 if sign == "1" or sign=="3": #判断修改的地址是否属于当前登录用户 if not util.check_User_By_Order(request,username,orders_id): return render(request,"error.html",{"error":"你试图删除不属于你的单独一个订单信息!"}) else:.... elif sign == "2": if not util.check_User_By_Orders(request,username,orders_id): return render(request,"error.html",{"error":"你试图删除不属于你的总订单信息!"}) else:....

最后来设计测试数据与测试程序,在orderConfig.xml中数据如下。

... <!--- 试图删除当前不属于自己的总订单 --> <case> <TestId>order-testcase006</TestId> <Title>订单信息</Title> <Method>get</Method> <Desc>试图删除当前不属于自己的总订单</Desc> <Url>http://127.0.0.1:8000/delete_orders/100/2/</Url><!--- “100”作为测试程序总订单id插入数据库表中 --> <InptArg></InptArg> <Result>200</Result> <CheckWord>你试图</CheckWord><!--- 检查试图删除不属于自己总订单有无得逞 --> </case> <!--- 试图删除当前不属于自己的单个订单 --> <case> <TestId>order-testcase007</TestId> <Title>订单信息</Title> <Method>get</Method> <Desc>试图删除当前不属于自己的单个订单</Desc> <Url>http://127.0.0.1:8000/delete_orders/100/1/</Url><!--- “100”作为测试程序单个订单id插入数据库表中 --> <InptArg></InptArg> <Result>200</Result> <CheckWord>你试图</CheckWord><!--- 检查试图删除不属于自己单个订单有无得逞 --> </case>....

在orderTest.py中代码如下。

...#初始化非法操作信息 self.myuservalue = "" self.myordervalues = "" self.myordersvalues = "" #开始测试 def test_order_info(self): for mylist in self.mylists: if ("你试图" in mylist["CheckWord"]): #建立用户信息 self.myuservalue = "1,\"121\",\"123456\",\"12345@126.com\"" #建立用户信息与上面和用户关联的单个订单和总订单,id从mylist["Url"]中获取 id = (mylist["Url"]).split("/")[4] self.myordervalues = id+",2,0,"+id+",1" self.myordersvalues = id+",\"Sept. 13, 2017, 3:55 a.m.,\",0,0" #建立一个用户 self.util.insertTable(self.dataBase,self.userTable,self.myuservalue) #建立一个总订单 self.util.insertTable(self.dataBase,self.ordersTable,self.myordersvalues) #建立一个单个订单 self.util.insertTable(self.dataBase,self.orderTable,self.myordervalues) data = self.util.run_test(mylist,self.userValues,self.sign)... def tearDown(self): #对于非法操作进行时候处理 self.util.tearDown(self.dataBase,self.userTable,self.myuservalue) self.util.tearDown(self.dataBase,self.orderTable,self.myordervalues) self.util.tearDown(self.dataBase,self.ordersTable,self.myordersvalues)....

星云测试

http://www.teststars.cc

奇林软件

http://www.kylinpet.com

联合通测

http://www.quicktesting.net

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

本文分享自 软件测试培训 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 4.3权限操作的漏洞
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档