SQL注入

攻击原理

在编写SQL语句时,如果直接将用户传入的数据作为参数使用字符串拼接的方式插入到SQL查询中,那么攻击者可以通过注入其他语句来执行攻击操作,这些攻击包括可以通过SQL语句做的任何事:获取敏感数据、修改数据、删除数据库表等

攻击示例

假设我们的程序是一个学生信息查询程序,其中的某个视图函数接收用户输入的密码,返回根据密码查询对应的数据。我们的数据库有一个db对象表示,SQL语句通过execute()方法执行:

@app.route('/students')
def bobby_table():
    password = request.args.get('password')
    cur = db.execute("SELECT * FROM students WHERE password = '%s';" %password)#直接使用用户输入的数据执行sql
   
results = cur.fetchall()
    return results

在实际应用中,敏感数据需要通过表单提交的POST请求接收,这里为了便于演示,通过查询参数接收。

我们通过查询字符串获取用户插入的查询参数,并且不经过任何处理就使用字符串格式化的方法拼接到SQL语句中。在这种情况下,如果攻击者输入的参数值为” ‘or 1 =1”,即http://example.com/students?password=’or 1=1 --,那么视图函数中被执行的SQL语句就变成:

select * from students where password=’’ or 1=1 --;’

这时会把students表中所有记录全部查询并返回,也就意味着所有的记录都被攻击者窃取了。更可怕的是,如果攻击者将password参数的值设为”’; drop table users; --”,那么查询语句就会变成:

select * from students where password=’ ’; drop table users; --’

这个语句会把students表中所有的记录全部删掉。

在SQL中,“;”用来结束一行语句;“--”用来注视后边的语句,类似python的”#”。

主要防范方法

验证输入类型

比如某个视图函数接收整形id来查询,那么就在URL规则中限制URL变量为整形。

参数化查询

在构造SQL语句时避免使用拼接字符串或字符串格式化(使用百分号或format()方法)的方式来构建SQL语句。而要使用各类接口库提供的参数化查询方法,以mysql为例:

db.execute(‘select * from students where password=@password’),此时,即使password的值是“’ or 1=1 --”话,那么SQL在执行的时候会把password这个变量单独进行解析:

@password=’’ or 1=1 –‘,并不会像拼接字符串那样使这个SQL执行其他的动作,所以就不会被注入了

转义特使字符

比如引号、分号和横线等。使用参数化查询时,各种接口库会为我们做转义工作。

web安全防范之SQL注入攻击、攻击原理和防范措施的更多相关文章

  1. 利用“参数赋值”防范SQL注入漏洞攻击

    <<年轻,无权享受>————送给每一个看到此文的同僚们 在这无精打采的炎夏 我躺在阳台上房东的旧沙发 回想几个月来遇到的问题 我不禁内心开始慌张喘着粗气 还有大把时间去打拼 没有到只 ...

  2. web攻击之八:溢出攻击(nginx服务器防sql注入/溢出攻击/spam及禁User-agents)

    一.什么是溢出攻击 首先, 溢出,通俗的讲就是意外数据的重新写入,就像装满了水的水桶,继续装水就会溢出,而溢出攻击就是,攻击者可以控制溢出的代码,如果程序的对象是内核级别的,如dll.sys文件等,就 ...

  3. 网站跨站点脚本,Sql注入等攻击的处理

    从360安全论坛里找到的一段代码,经过整理封装,直接在站点Global.asax文件或写一个HttpModule来拦截恶意请求即可: http://bbs.webscan.360.cn/forum.p ...

  4. [原]网站跨站点脚本,Sql注入等攻击的处理

    从360安全论坛里找到的一段代码,经过整理封装,直接在站点Global.asax文件或写一个HttpModule来拦截恶意请求即可: http://bbs.webscan.360.cn/forum.p ...

  5. nginx服务器防sql注入/溢出攻击/spam及禁User-agents

    本文章给大家介绍一个nginx服务器防sql注入/溢出攻击/spam及禁User-agents实例代码,有需要了解的朋友可进入参考. 在配置文件添加如下字段即可  代码如下 复制代码 server { ...

  6. Web安全学习笔记 SQL注入下

    Web安全学习笔记 SQL注入下 繁枝插云欣 --ICML8 SQL注入小技巧 CheatSheet 预编译 参考文章 一点心得 一.SQL注入小技巧 1. 宽字节注入 一般程序员用gbk编码做开发的 ...

  7. Web安全学习笔记 SQL注入上

    Web安全学习笔记 SQL注入上 繁枝插云欣 --ICML8 SQL注入分类 SQL注入检测 一.注入分类 1.简介 SQL注入是一种代码注入技术用于攻击数据驱动的应用程序在应用程序中,如果没有做恰当 ...

  8. Web安全学习笔记 SQL注入中

    Web安全学习笔记 SQL注入中 繁枝插云欣 --ICML8 权限提升 数据库检测 绕过技巧 一.权限提升 1. UDF提权 UDF User Defined Function,用户自定义函数 是My ...

  9. Web安全篇之SQL注入攻击

    在网上找了一篇关于sql注入的解释文章,还有很多技术,走马观花吧 文章来源:http://www.2cto.com/article/201310/250877.html ps:直接copy,格式有点问 ...

随机推荐

  1. javascript替代Array.prototype.some操作

    Array.prototype.some在低版本浏览器好像不太兼容,下列是替代方法 一. for 循环 const initIds: any[] = [1,2,3]; const Ids: any[] ...

  2. 关于mobilesroll使用方法的再次声明

    js $('#name').click(function(valueText) { $('#demo').mobiscroll('show'); // return false; }); $(&quo ...

  3. 20170724 Airflow官网资料学习

    -- 1  Apache Airflow 文档 AirFlow 对编程人员来讲就是一个平台,用于进行日程安排和监控.但是还在卵化期,严格来说,不是一个完整的成品.

  4. MySQL8.0.11 组复制配置

     my.cnf [mysql] prompt='node2 [\h] {\u} (\d) > ' # [client] user = sa password = cc.123 port = 22 ...

  5. 【BFS宽度优先搜索】

    一.求所有顶点到s顶点的最小步数   //BFS宽度优先搜索 #include<iostream> using namespace std; #include<queue> # ...

  6. LigerUi折叠与展开

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  7. 自己实现strtok函数

    思路:每次在原来字符串中查找分隔字符串,将分隔字符串中所有字符设为'\0',然后输出分隔串前的子串,同时更新原串的起始位置. PS:有不少博客作者自己实现的方法中往往只将分隔串当做一个字符,实际上可以 ...

  8. HBase 数据迁移方案介绍 (转载)

    原文地址:https://www.cnblogs.com/ballwql/p/hbase_data_transfer.html 一.前言 HBase数据迁移是很常见的操作,目前业界主要的迁移方式主要分 ...

  9. [LeetCode] 506. Relative Ranks_Easy tag: Sort

    Given scores of N athletes, find their relative ranks and the people with the top three highest scor ...

  10. AC自动机模板2

    题目链接:https://www.luogu.org/problemnew/show/P3796 #include <cstdio> #include <cmath> #inc ...