sql注入:

所谓sql注入,就是通过把sql命令插入到表单中或页面请求的查询字符串中,最终达到欺骗服务器执行恶意的sql命令。具体来说,它是利用现有的应用程序,将(恶意的)sql命令注入到后台数据库引擎执行的能力,它也可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者的意图去执行sql语句。比如先前的很多影视网站泄露VIP会员密码大多数就是通过Web表单递交查询字符串爆出的。

(1)现在我们有一个sql_user表,表结构如下:

from django.db import models
from django.core import validators class User(models.Model):
username = models.CharField(max_length=20)
password = models.CharField(max_length=24)
telephone = models.CharField(max_length=11, validators=[validators.RegexValidator(r"1[345678]\d{9}")]) class Meta:
db_table = 'sql_user'

(2)然后我们使用原生sql语句实现以下需求:

(1)实现一个根据用户id获取用户详情的视图,示例代码如下:
from django.http import HttpResponse
from django.db import connection
from django.shortcuts import render def index(request):
cursor = connection.cursor()
user_id = request.GET.get('id')
context = {} if user_id:
cursor.execute("select id,username from sql_user where id=%s"%user_id)
users = cursor.fetchall()
for user in users:
print(user)
context['users'] = users
return render(request, 'sql.html', context=context)
else:
return HttpResponse('该用户不存在!!!')
(2)正常情况,用户可以使用查询字符串的形式访问该网页,并且查询用户的详情,可以输入:http://127.0.0.1:8000/sql/?id=2, 这样的话,就会返回给用户数据库中id为2的用户详情。可是,如果用户在这个时候,进行sql注入,比如,输入:http://127.0.0.1:8000/sql/?id=2 or 1=1,很显然,1=1这样的条件是永远为True的,这样的话,就会返回给用户数据库中存在的所有用户的数据,就会造成用户信息的泄露。
(3)根据用户名提取用户相关的信息,示例代码如下:
from django.http import HttpResponse
from django.db import connection
from django.shortcuts import render def index(request):
cursor = connection.cursor()
username = request.GET.get('username')
context = {}
if username:
cursor.execute("select id, username from sql_user where username='%s'"%username)
users = cursor.fetchall()
for user in users:
print(user)
context['users'] = users
return render(request, 'sql.html', context=context)
else:
context['users'] = '您输入的用户不存在!'
return render(request, 'sql.html', context=context)
注意,如果在执行sql语句的时候没有在%s两边用单引号包裹,那么在输入url的时候一定要将username对应的值加上单引号http://127.0.0.1:8001/sql/?username='孤烟逐云',否者的话,会报错:“OperationalError at /sql/(1054, "Unknown column '孤烟逐云' in 'where clause'")”。但是,如果我们在执行sql语句的时候,在%s两边加上单引号,那么在url中输入查询字符串的时候,就不用加单引号了。
正常情况下,我们应该输入:http://127.0.0.1:8001/sql/?username=孤烟逐云 ,网页就会返回给我们查询到的用户的详情。但是,如果我们不遵循设计者的意愿,输入http://127.0.0.1:8001/sql/?username=孤烟逐云' or '1=1很显然,这个结果永远为True 。那么,就会给用户返回数据库中所有的用户信息,并且此时不管你输入的username是否存在数据库中,也不管你后面输入的是1=4还是1=3都会返回数据库中所有的信息。其实此时已经破坏了网页的结构。

sql注入防御:

通过传递一些恶意代码来破坏原有的sql语句以便达到自己的目的。那么我们该如何防御sql注入呢? 归类起来主要有以下几点:

(1)永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双引号进行转换等。
(2)永远不要使用动态拼接sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取,比如:
sql = "select id, username from sql_user where username=%s"
cursor.execute(sql, (username,))
<!--参数化的形式execute(sql语句,(参数,)),其中参数后面的逗号表示execute()传入的是一个元组。-->
(3)永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
(4)不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
(5)应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始信息进行包装。

在Django中如何防御sql注入:

(1)使用ORM来做数据的增删改查,因为ORM使用的是参数化的形式执行sql语句。
(2)如果要执行原生sql语句,那么建议不要使用拼接的sql,而是使用参数化的形式。

159.SQL注入的实现和防御措施的更多相关文章

  1. SQL注入之代码层防御

    [目录] 0x0 前言 0x1 领域驱动的安全 1.1 领域驱动的设计 1.2 领域驱动的安全示例 0x2 使用参数化查询 2.1 参数化查询 2.2 Java中的参数化语句 2.3 .NET(C#) ...

  2. SQL注入原理&分类&危害&防御

    SQL是什么? 结构化查询语句 SQL注入是什么? 是一种将SQL 语句插入或添加到用户输入的参数中,这些参数传递到后台服务器,加以解析并执行 造成注入的原因/原理? 1.对用户输入的参数没有进行严格 ...

  3. SQL注入的那些面试题总结

    一.知识储备类 1.SQL与NoSQL的区别? SQL:关系型数据库 NoSQL:非关系型数据库 存储方式:SQL具有特定的结构表,NoSQL存储方式灵活 性能:NoSQL较优于SQL 数据类型:SQ ...

  4. 注入攻击(SQL注入防御)

    正确的防御SQL注入 sql注入的防御不是简单只做一些用户输入的escape处理,这样是不够的,只是提高了攻击者的门槛而已,还是不够安全. 例如 mysql_real_escape_string()函 ...

  5. SQL注入(SQL Injection)案例和防御方案

    sql注入(SQL Injection):就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. SQL注入攻击的主要危害包括:非法读取.篡 ...

  6. 程序员常用的3大Web安全漏洞防御解决方案:XSS、CSRF及SQL注入(图文详解)

    https://blog.csdn.net/ChenRui_yz/article/details/86489067 随着互联网的普及,网络安全变得越来越重要,程序员需要掌握最基本的web安全防范,下面 ...

  7. Web安全之SQL注入(原理,绕过,防御)

    首先了解下Mysql表结构 mysql内置的information_schema数据库中有三个表非常重要1 schemata:表里包含所有数据库的名字2 tables:表里包含所有数据库的所有的表,默 ...

  8. 防御sql注入

    1. 领域驱动安全 领域驱动安全是一种代码设计方法.其思想是将一个隐式的概念转化为显示,个人认为即是面向对象的方法,将一个概念抽象成一个类,在该类中通过方法对类的属性进行约束.是否是字符串,包含什么字 ...

  9. web安全之sql注入的防御

    自动把引号转义     1.防御sql注入的基本原则           任何时候不应该改变用户的输入                    比如用户输入单引号,那输出也要是单引号.   几种基本的防 ...

随机推荐

  1. C#实现的一些常见时间格式

    string aa = DateTime.Now.ToShortDateString();//"2019/9/23" string bb = DateTime.Now.ToShor ...

  2. Resnet——深度残差网络(一)

    我们都知道随着神经网络深度的加深,训练过程中会很容易产生误差的积累,从而出现梯度爆炸和梯度消散的问题,这是由于随着网络层数的增多,在网络中反向传播的梯度会随着连乘变得不稳定(特别大或特别小),出现最多 ...

  3. Python小白

      .IDLE软件为内建于CPython的集成开发环境(IDE),包括编辑器,编译或解释器,调试器       .py(后缀保存) 2.行一,单行注释     多行,”””    ‘’’  之后,内建 ...

  4. P1149 火柴棒等式(打表初尝试)

    题目描述 给你 n 根火柴棍,你可以拼出多少个形如 “A+B=CA+B=C” 的等式?等式中的 A.B.C 是用火柴棍拼出的整数(若该数非零,则最高位不能是 0).用火柴棍拼数字 0−9 的拼法如图所 ...

  5. 【58】目标检测之YOLO 算法

    YOLO 算法(Putting it together: YOLO algorithm) 你们已经学到对象检测算法的大部分组件了,在这个笔记里,我们会把所有组件组装在一起构成YOLO对象检测算法.   ...

  6. 如何规范git commit提交

    相信很多人使用SVN.Git等版本控制工具时候都会觉得每次提交都要写一个注释有什么用啊?好麻烦,所以我每次都是随便写个数字就提交了,但是慢慢的我就发现了,如果项目长期维护或者修改很久之前的项目,没有一 ...

  7. 安装Mailx到CentOS(YUM)

    运行环境 系统版本:CentOS Linux release 7.3.1611 (Core) 软件版本:无 硬件版本:无 安装过程 1.配置网络 [root@localhost ~]# vi /etc ...

  8. 清北学堂—2020.1提高储备营—Day 1 morning(模拟、枚举、搜索)

    qbxt Day 1 morning --2020.1.17 济南 主讲:李佳实 目录一览 1.模拟和枚举 2.基础搜索算法(DFS.BFS.记忆化搜索)以及进阶搜索算法(纯靠自学) 总知识点:基础算 ...

  9. Linux系统之网络相关的命令

    Linux系统之网络相关的命令 网络概述 网络:通过通信介质和通信设备 将分布不同地点的两台或多台计算机,经过相应的程序实现通信switch 交换机router 路由器网络的功能:数据通信:利用网络传 ...

  10. c# 使用T4模板生成实体类(sqlserver)

    新建类库,右键添加 "文本模板" 添加完成之后生成如下后缀为 tt的文件: 双击文件:TextTemplate_Test.tt 文件打开,替换代码如下 <#@ templat ...