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: ret
然后修改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) ....
星云测试
奇林软件
联合通测
顾翔凡言:
软件测试正在生病,而且病得不轻,自动化测试被要不吹得太火,要不一点都不会,自动化比不过开发、测试又找不到缺陷,丢了西瓜也捡不到芝麻。