159.SQL注入的实现和防御措施
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注入的实现和防御措施的更多相关文章
- SQL注入之代码层防御
[目录] 0x0 前言 0x1 领域驱动的安全 1.1 领域驱动的设计 1.2 领域驱动的安全示例 0x2 使用参数化查询 2.1 参数化查询 2.2 Java中的参数化语句 2.3 .NET(C#) ...
- SQL注入原理&分类&危害&防御
SQL是什么? 结构化查询语句 SQL注入是什么? 是一种将SQL 语句插入或添加到用户输入的参数中,这些参数传递到后台服务器,加以解析并执行 造成注入的原因/原理? 1.对用户输入的参数没有进行严格 ...
- SQL注入的那些面试题总结
一.知识储备类 1.SQL与NoSQL的区别? SQL:关系型数据库 NoSQL:非关系型数据库 存储方式:SQL具有特定的结构表,NoSQL存储方式灵活 性能:NoSQL较优于SQL 数据类型:SQ ...
- 注入攻击(SQL注入防御)
正确的防御SQL注入 sql注入的防御不是简单只做一些用户输入的escape处理,这样是不够的,只是提高了攻击者的门槛而已,还是不够安全. 例如 mysql_real_escape_string()函 ...
- SQL注入(SQL Injection)案例和防御方案
sql注入(SQL Injection):就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. SQL注入攻击的主要危害包括:非法读取.篡 ...
- 程序员常用的3大Web安全漏洞防御解决方案:XSS、CSRF及SQL注入(图文详解)
https://blog.csdn.net/ChenRui_yz/article/details/86489067 随着互联网的普及,网络安全变得越来越重要,程序员需要掌握最基本的web安全防范,下面 ...
- Web安全之SQL注入(原理,绕过,防御)
首先了解下Mysql表结构 mysql内置的information_schema数据库中有三个表非常重要1 schemata:表里包含所有数据库的名字2 tables:表里包含所有数据库的所有的表,默 ...
- 防御sql注入
1. 领域驱动安全 领域驱动安全是一种代码设计方法.其思想是将一个隐式的概念转化为显示,个人认为即是面向对象的方法,将一个概念抽象成一个类,在该类中通过方法对类的属性进行约束.是否是字符串,包含什么字 ...
- web安全之sql注入的防御
自动把引号转义 1.防御sql注入的基本原则 任何时候不应该改变用户的输入 比如用户输入单引号,那输出也要是单引号. 几种基本的防 ...
随机推荐
- Linux忘记root用户的密码
问题: 由于长时间没有操作过自己安装的虚拟机,导致连root用户的密码都忘了,也真是没谁了. 我使用的是centos6.5,今天就记录一下,如何重置root用户的密码. 操作步骤: 步骤一: 当开机启 ...
- Nginx 和Apache 中的虚拟主机的概念
在部署环境的时候,有时候会引用到虚拟主机的概念,什么是虚拟主机呢,博主之前一直把虚拟主机的概念没搞清楚,导致在部署的时候,一直动不动就404 ,或者500,或者服务器不通 所以,什么是虚拟主机呢? 虚 ...
- C语言再学习part2-重新认识C语言词汇
迷阳迷阳,无伤吾行.无行郗曲,无伤吾足.—庄子 C语言词汇: 标识符 在程序中的变量名.函数名.标号等等成为标识符.其中标识符相在C中只能是字母A~Z,a~z,数字0~9,下划线(_)组成的字符串,并 ...
- .net全栈开发-c#面向对象与工控自动化分拣上位机
一.前言 开始做了两年web.期间也整了一段时间winform.后来做了两年工控上位机,也就是做工控这两年发现机器跟面向对象真是如此贴切,也是我从处理数据和流程的思维转变为面向对象思维的开始.这对我后 ...
- Java Web笔记(2)
学习笔记,狂神说java,链接:https://www.bilibili.com/video/av68833391 5.Maven 我为什么要学习这个技术? 在Javaweb开发中,需要使用大量的ja ...
- JavaSE学习笔记(14)---File类和IO流(字节流和字符流)
JavaSE学习笔记(14)---File类和IO流(字节流和字符流) File类 概述 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 构造方 ...
- win7安装SQL Server 2005 的问题总结
SQL Server 安装程序无法连接到数据库服务进行服务器配置. 错误为: [Microsoft][SQL Native Client]客户端不支持加密. 有关详细信息,请参阅服务器错误日志和安装日 ...
- MySQL优化(四)——读写分离
1.MySQL高可用 主从复制 一主多备 多主多备 读写分离 减少IO开销,防止阻塞等等 2.主从复制参考 https://www.cnblo ...
- MySQL 8 服务端帮助支持
MySQL 服务器支持 HELP 语句,该语句返回参考手册中相应信息,比如: mysql> help change master to; 返回创建主从复制相关语句的信息 参考手册的信息存储在my ...
- js返回时间差
function CalcTimeSub(endTime, startTime, type) { var bool = endTime == defaultDateTime || startTime ...