zoukankan      html  css  js  c++  java
  • django-sql注入攻击

    一、原理

    什么是sql注入

    所谓SQL注入就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串(注入本质上就是把输入的字符串变成可执行的程序语句),最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。在Web应用漏洞中,SQL Injection 漏洞的风险要高过其他所有的漏洞。

    相关原理

    根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。

    二、表现

    SQL注入的产生原因通常表现在以下几方面:

    • 不当的类型处理;
    • 不安全的数据库配置;
    • 不合理的查询集处理;
    • 不当的错误处理;
    • 转义字符处理不合适;
    • 多个提交处理不当。

    三、实例

    常见的就是进行登录验证的时候,表单提交的数据包含sql语句,代码如下

    登录页面

    login.html:简单的表单登录

    <h1>欢迎登陆<h1>
    <from method='post' >
    <input type='text' name='username' >
    <input type='text' name='password'>
    <input type="submit" value="立即登录" > 
    </form>
    

    视图函数

    views.py:对表单进项获取之后,直接转换为SQL语句进行数据数据库查询。

    from django.shortcuts import render, HttpResponse, redirect
    from django.views.generic.base import View
    
    class LoginNotSafeView(View):
        def get(self, request):
            return render(request, 'login.html')
        def post(self, request):
            user_name = request.POST.get("username", "")
            pass_word = request.POST.get("password", "")
    
            import pymysql
            conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='123456', db='mxonline',charset='utf8' )
            cursor = conn.cursor()
            # 黑客可通过user或者password输入数据库语句对数据非法利用
            sql_select = " select * from users_userprofile where username='{0}' and passworf='{1}' ".format(user_name, pass_word)
            result = cursor.execute(sql_select)
            for i in cursor.fetchall():
                # 数据库所有查询结果
                pass
    

    如果想username框中填写admin,password为123
    上面sql_select = " select * from users_userprofile where username='{0}' and passworf='{1}' 就相当于select * from users_userprofile where username=admin and passworf=123 进行查询
    但是
    如果想username框中填写admin or admin=admin #,password为123
    如果想username框中填写admin,password为123
    上面sql_select = " select * from users_userprofile where username='{0}' and passworf='{1}' 就相当于select * from users_userprofile where username=admin or admin = admin # and passworf=123 进行查询
    这里的#相当于把后面的所有查询包括password查询给注释,并且 or admin = admin的查询永远是正确的,所以sql攻击注入就完成了

    四、防范

    • 对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。
    • 不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。
    • 不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
    • 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

    五、其他攻击

    xss攻击
    csrf攻击

  • 相关阅读:
    Educational Codeforces Round 67 D. Subarray Sorting
    2019 Multi-University Training Contest 5
    Educational Codeforces Round 69 (Rated for Div. 2) E. Culture Code
    Educational Codeforces Round 69 D. Yet Another Subarray Problem
    2019牛客暑期多校训练第六场
    Educational Codeforces Round 68 E. Count The Rectangles
    2019牛客多校第五场题解
    2019 Multi-University Training Contest 3
    2019 Multi-University Training Contest 2
    [模板] 三维偏序
  • 原文地址:https://www.cnblogs.com/welan/p/9461153.html
Copyright © 2011-2022 走看看