sql注入的原因,表面上说是因为 拼接字符串,构成sql语句,没有使用 sql语句预编译,绑定变量。但是更深层次的原因是,将用户输入的字符串,当成了 “sql语句” 来执行。

1.union注入攻击

<?php
$con=mysqli_connect("localhost","root","","test");
// 检测连接
if (mysqli_connect_errno())
{
    echo "连接失败: " . mysqli_connect_error();
}

$id = $_GET['id'];

$result = mysqli_query($con,"select * from users where `id`=".$id);

while($row = mysqli_fetch_array($result))
{
    echo $row['username'] . " " . $row['address'];
    echo "<br>";
}
?>

当前端通过get方法传参进来之后,如果没有进行判断,或者过滤一些非法的字符串,这些非法的字符串,就会和$result = mysqli_query($con,"select * from users where `id`=".$id);拼接在一起,然后传入后台数据库,进行sql语句查询,然后数据库会返回来所查询到的信息,以至于泄露用户的账号及其密码等敏感信息,因此程序员在编写程序时,一定要对传入的参数值进行过滤。

2.boolean注入攻击

<?php
$con=mysqli_connect("localhost","root","","test");
// 检测连接
if (mysqli_connect_errno())
{
    echo "连接失败: " . mysqli_connect_error();
}

$id = $_GET['id'];

if (preg_match("/union|sleep|benchmark/i", $id)) {
    exit("no");
}

$result = mysqli_query($con,"select * from users where `id`='".$id."'");

$row = mysqli_fetch_array($result);

if ($row) {
    exit("yes");
}else{
    exit("no");
}

?>

3.报错注入

<?php
$con=mysqli_connect("localhost","root","","test");
// 检测连接
if (mysqli_connect_errno())
{
    echo "连接失败: " . mysqli_connect_error();
}

$username = $_GET['username'];

if($result = mysqli_query($con,"select * from users where `username`='".$username."'")){
    echo "ok";
}else{
    echo mysqli_error($con);      /*这个语句本不应该在这里出现的,在编写程序时,程序员为了检查代码,然后造成了报错sql注入,如果将输出语句改成 echo "no",即便查询语句传入数据库,但也没办法在前端              显示,但是还是要对传入的参数进行过滤的*/
}

?>

通过上面两个实例,我们对sql注入有了初步的了解,平时应该怎样防御sql注入呢?

4.sql注入的防御

1>采用sql语句预编译和绑定变量,是防御sql注入的最佳方法。

String  sql = "select  * from test where id=?";

PreparedStatement  ps = conn.prepareStatement(sql);

ps.setInt(1,id);

ps.executeQuery();

通过采用PreparedStatement,就会将sql语法 "select  * from test where id=?" 预先编译好,也就是SQL引擎会预先进行语法分析,产生语法树,生成执行计划,也就是说,后面你输入的参数,无论你输入的是什么,都不会影响sql语句的语法结构,因为语法分析已经完成了,而语法分析主要是分析sql命令,如select,from,等等,所以即便你后面输入了这些sql命令,也不会当成sql命令来执行,因为这些sql命令的执行,必须先得通过语法分析,生成执行计划,既然语法分析已经完成,已经预编译过了,那么后面输入的参数,是绝对不可能作为sql命令来执行的,只会被当做字符串字面值参数。所以sql语句预编译可以防御sql注入

2>除了以上得方法,我们还需要使用一些安全函数来防止sql注入,因为不是所有场景都能够采用 sql语句预编译,有一些场景必须的采用 字符串拼接的方式。

比如 String sql = "select * from test where id =" +id;

在接收到用户输入的参数时,我们就严格检查 id,只能是int型。复杂情况可以使用正则表达式来判断。这样也是可以防止sql注入的。

MySQLCodec codec = new MySQLCodec(Mode.STANDARD);
name = ESAPI.encoder().encodeForSQL(codec, name);
String sql = "select * from test where name=" + name;
ESAPI.encoder().encodeForSQL(codec, name)
该函数会将 name 中包含的一些特殊字符进行编码,这样 sql 引擎就不会将name中的字符串当成sql命令来进行语法分析了。

sql注入代码分析及预防的更多相关文章

  1. sql注入实例分析

    什么是SQL注入攻击?引用百度百科的解释: sql注入_百度百科: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具 ...

  2. PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/p ...

  3. [置顶] SQL注入安全分析

    (一)       应用环境列表 网络互联设备操作系统 序号 操作系统名称 设备名称 脆弱性 1 IOS_路由器_内部_1 route1 2 IOS_路由器_VPN_1 路由器_VPN_1 3 IOS ...

  4. Beescms_v4.0 sql注入漏洞分析

    Beescms_v4.0 sql注入漏洞分析 一.漏洞描述 Beescms v4.0由于后台登录验证码设计缺陷以及代码防护缺陷导致存在bypass全局防护的SQL注入. 二.漏洞环境搭建 1.官方下载 ...

  5. 预防XSs和sql注入常见分析

    SQL注入简介SQL 注入漏洞(SQL Injection)是 Web 开发中最常见的一种安全漏洞.可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可 ...

  6. PDO防sql注入原理分析

    使用pdo的预处理方式可以避免sql注入. 在php手册中'PDO--预处理语句与存储过程'下的说明: 很多更成熟的数据库都支持预处理语句的概念.什么是预处理语句?可以把它看作是想要运行的 SQL 的 ...

  7. C#防SQL注入代码的实现方法

    对于网站的安全性,是每个网站开发者和运营者最关心的问题.网站一旦出现漏洞,那势必将造成很大的损失.为了提高网站的安全性,首先网站要防注入,最重要的是服务器的安全设施要做到位. 下面说下网站防注入的几点 ...

  8. DM企业建站系统v201710 sql注入漏洞分析 | 新版v201712依旧存在sql注入

    0x00 前言 本来呢,这套CMS都不想审的了.下载下来打开一看,各种debug注释,排版烂的不行. 贴几个页面看看 感觉像是新手练手的,没有审下去的欲望了. 但想了想,我tm就是新手啊,然后就继续看 ...

  9. Vtiger CRM 几处SQL注入漏洞分析,测试工程师可借鉴

    本文由云+社区发表 0x00 前言 干白盒审计有小半年了,大部分是业务上的代码,逻辑的复杂度和功能模块结构都比较简单,干久了收获也就一般,有机会接触一个成熟的产品(vtiger CRM)进行白盒审计, ...

随机推荐

  1. Python 为什么不设计 do-while 循环结构?

    在某些编程语言中,例如 C/C++.C#.PHP.Java.JavaScript 等等,do-while 是一种基本的循环结构. 它的核心语义是:先执行一遍循环体代码,然后执行一遍条件语句,若条件语句 ...

  2. Redis Hyperloglog的原理及数学理论的通俗理解

    redis中有一种数据格式,hyperloglog,本文就此数据结构的作用.redis的实现及其背后的数学原理作一个整理.当然本文不包含任何数学公式,而是希望用直观的例子帮大家理解. 主要内容如下: ...

  3. 3 Ways to Learn Whether a Windows Program is 64-bit or 32-bit

    More than 90% of Windows 8.1 installations are 64-bit and, as a result, more and more people use 64- ...

  4. Airtest 的连接安卓模拟器

    1. 开启安卓模拟器 2. 查看进程,MEmuHeadless.exe的进行程号, 然后在cmd中输入 netstat -ano|findstr "16116" 3. 到 airt ...

  5. 随机IP代理插件Scrapy-Proxies

    安装: pip install scrapy_proxies github:   https://github.com/aivarsk/scrapy-proxies scrapy爬虫配置文件setti ...

  6. Win11怎么启动任务管理器?Win11启动任务管理器的四种方法

    Win11怎么启动任务管理器?小编为大家带来了Win11启动任务管理器的四种方法,感兴趣的朋友一起看看吧 任务管理器是Windows系统中一项非常实用的功能.不过在最新版Win11中,右击任务栏启动任 ...

  7. 使用gige2500万相机时遇见的问题(条纹以及取图过久)

    1.确保网卡支持1g全双工: 2.确保安装了MVTec GigE Vision Streaming Filter(使用halcon接口的情况下) 3.确保机台的杀毒软件开放了相机的网络监控功能

  8. SpringMVC 解析(二)DispatcherServlet

    在我的关于Tomcat容器介绍的文章中,介绍了Tomcat容器的工作原理,我们知道Tomcat容器在收到请求之后,会把请求处理为Request/Response对象,交给Servlet实例处理.对于S ...

  9. JavaCV的摄像头实战之六:保存为mp4文件(有声音)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  10. 分布式系统及CAP理论

    一.集中式系统 在学习分布式之前,先了解一下与之相对应的集中式系统是什么样的. 集中式系统用一句话概括就是:一个主机带多个终端.终端没有数据处理能力,仅负责数据的录入和输出.而运算.存储等全部在主机上 ...