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攻击

  • 相关阅读:
    用css画三角形(提示框三角形)
    SpringMVC(2)之表单(非表单)参数绑定
    mvn jetty:run--编码GBK的不可映射字符
    Git命令及常见问题
    eclipse整合ssh框架基础
    css基础一(权重与position)
    sublime Text3下sass环境配置(windows)
    sublime Text3 设置多个浏览器预览
    初识iOS NSTimer 循环引用不释放问题
    ARC MARC 文件支持
  • 原文地址:https://www.cnblogs.com/welan/p/9461153.html
Copyright © 2011-2022 走看看