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

简介: 顾翔老师开发的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:
        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所示。

   

image.png

     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


顾翔凡言:

      软件测试正在生病,而且病得不轻,自动化测试被要不吹得太火,要不一点都不会,自动化比不过开发、测试又找不到缺陷,丢了西瓜也捡不到芝麻。

目录
相关文章
|
3月前
|
前端开发 搜索推荐 算法
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
中草药管理与推荐系统。本系统使用Python作为主要开发语言,前端使用HTML,CSS,BootStrap等技术和框架搭建前端界面,后端使用Django框架处理应用请求,使用Ajax等技术实现前后端的数据通信。实现了一个综合性的中草药管理与推荐平台。具体功能如下: - 系统分为普通用户和管理员两个角色 - 普通用户可以登录,注册、查看物品信息、收藏物品、发布评论、编辑个人信息、柱状图饼状图可视化物品信息、并依据用户注册时选择的标签进行推荐 和 根据用户对物品的评分 使用协同过滤推荐算法进行推荐 - 管理员可以在后台对用户和物品信息进行管理编辑
93 12
中草药管理与推荐系统Python+Django网页界面+推荐算法+计算机课设系统+网站开发
|
7月前
|
搜索推荐 算法 前端开发
美食物管理与推荐系统Python+Django网站开发+协同过滤推荐算法应用【计算机课设项目推荐】
美食物管理与推荐系统Python+Django网站开发+协同过滤推荐算法应用【计算机课设项目推荐】
202 4
美食物管理与推荐系统Python+Django网站开发+协同过滤推荐算法应用【计算机课设项目推荐】
|
存储 安全 前端开发
基于Django的电子商务网站开发(连载37)
顾翔老师开发的bugreport2script开源了,希望大家多提建议。文件在https://github.com/xianggu625/bug2testscript, 主文件是:zentao.py 。bugreport是禅道,script是python3+selenium 3,按照规则在禅道上书写的bugreport可由zentao.py程序生成py测试脚本。
153 0
基于Django的电子商务网站开发(连载37)
|
测试技术 Python
基于Django的电子商务网站开发(连载36)
顾翔老师开发的bugreport2script开源了,希望大家多提建议。文件在https://github.com/xianggu625/bug2testscript, 主文件是:zentao.py 。bugreport是禅道,script是python3+selenium 3,按照规则在禅道上书写的bugreport可由zentao.py程序生成py测试脚本。
96 0
基于Django的电子商务网站开发(连载36)
|
XML 测试技术 数据库
基于Django的电子商务网站开发(连载34)
基于Django的电子商务网站开发(连载34)
66 0
基于Django的电子商务网站开发(连载34)
|
XML 测试技术 数据格式
基于Django的电子商务网站开发(连载33)
顾翔老师开发的bugreport2script开源了,希望大家多提建议。文件在https://github.com/xianggu625/bug2testscript, 主文件是:zentao.py 。bugreport是禅道,script是python3+selenium 3,按照规则在禅道上书写的bugreport可由zentao.py程序生成py测试脚本。
97 0
基于Django的电子商务网站开发(连载33)
|
SQL XML 前端开发
基于Django的电子商务网站开发(连载40)
顾翔老师开发的bugreport2script开源了,希望大家多提建议。文件在https://github.com/xianggu625/bug2testscript, 主文件是:zentao.py 。bugreport是禅道,script是python3+selenium 3,按照规则在禅道上书写的bugreport可由zentao.py程序生成py测试脚本。
184 0
|
测试技术 Python
基于Django的电子商务网站开发(连载38)
顾翔老师开发的bugreport2script开源了,希望大家多提建议。文件在https://github.com/xianggu625/bug2testscript, 主文件是:zentao.py 。bugreport是禅道,script是python3+selenium 3,按照规则在禅道上书写的bugreport可由zentao.py程序生成py测试脚本。
92 0
|
XML 测试技术 数据格式
基于Django的电子商务网站开发(连载35)
基于Django的电子商务网站开发(连载35)
106 0
|
1月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
171 45