(整篇文章废话很多,但其实是为了新手能更好的了解这个sql注入是什么,需要学习的是文章最后关于如何预防sql注入)

(整篇文章废话很多,但其实是为了新手能更好的了解这个sql注入是什么,需要学习的是文章最后关于如何预防sql注入

(整篇文章废话很多,但其实是为了新手能更好的了解这个sql注入是什么,需要学习的是文章最后关于如何预防sql注入

重要的事情说三遍  ^-^

一.什么是SQL注入

  • 如何理解sql注入?

sql注入是一种将sql代码添加到输入参数中,传递到sql服务器解析并执行的一种攻击手法

示例:

本地一段代码为get获取id值,输出实际执行sql以及查询id对应内容。

       当id值传为1时,执行结果如下:

      

这是正常请求情况,而当我们往id传的参数中注入sql代码时,便可以根据自己需求查询自己想要获取的内容,例如:

       

id值传参数为  -1 OR 1=1 ,此时执行代码中id值带入了我们传参数的sql代码,  1=1 为真,OR 1=1便会查出表中所有的内容。            达到攻击目的。

所以sql注入攻击就是输入参数未经过滤,直接拼接到sql语句中,解析执行,达到预想之外的行为。

  • sql注入是如何产生的?

1.web开发人员无法保证所有的输入都已经过滤

      2.攻击者利用发送给sql服务器的输入数据构造可执行代码

3.数据库未作相应的安全配置(对web应用设置特定的数据库账号,而不使用root或管理员账号,特定数据库账号给予一些简单操作的权限,回收一些类似drop的操作权限)

二.如何寻找SQL注入漏洞

  • 如何寻找sql注入漏洞?

(借助逻辑推理)

   1.识别web应用中所有输入点

web应用中的输入包含三点:get,post,http头信息

2.了解哪些类型请求会触发异常

<1>比如get信息请求,获取文章id返回文章内容,当在get传递的id参数值后加“"”双引号,请求结果就会出现数据库异常错误.

<2>post请求示例,提交文章标题和文章内容,添加入库,正常情况是:

提交入库的sql如下:

但是当我们把标题输入为   标题"  ,提交后便会触发sql异常:

3.检测服务器响应中的异常

三.如何进行SQL注入攻击

(这里介绍两种主要的sql注入攻击)

  • 数字注入

sql中where条件的参数值为数字的语句进行修改攻击。

   也就是上面提到的  id = -1 OR 1=1

  • 字符串注入

以一个用户登陆为例:

<1.>以sql中的注释符号‘#’来实现攻击:

我们只需要知道数据库中的某一个用户的用户名,比如peter,在表单输入时,在用户名列输入  “peter'#”,密码随意输入,点击登陆后便会显示登陆成功,输出的sql语句为:

如上,用户名拼接“ ‘# ”说明:( ’ 单引号用来闭合用户名的输入,#井号用来注释掉后面的查询条件)

<2.>以注释符号‘ -- ’来实现攻击:

还是一样只需要知道数据库中的某一个用户的用户名,比如peter,在表单输入时,在用户名列输入  “peter'-- ” (双中横线后还有空格),密码随意输入,点击登陆后便会显示登陆成功,输出的sql语句为:

跟上面的#号攻击一样,sql语句执行都会跳过密码验证,在不需要知道密码的情况下就可以实现登陆。

四.如何预防SQL注入(分三种方法讲解)

  • 严格检查输入变量的类型和格式

1.对数字类型的参数id的强校验(empty()为空验证和is_numeric()进行数字验证)

                

                2.对字符串类型的参数的校验 (正则校验)

例如上面提到的登陆系统的用户名的校验,比如校验规则为 六位数字以上的字母或者数字,可以用preg_match("/^[a-zA-Z0-9]{6,}$/")

  • 过滤和转义特殊字符  

一.  用php函数addslashes()进行转义(addslashes函数使用方法详解点这里):

一般是对这些特殊字符进行转义:     

           1.单引号(')   2.双引号(")  3.反斜杠(\) 4. NULL

二. 用mysqli的php扩展中的函数 mysqli_real_escape_string()

注:这两种方法只做简单介绍用,但其实现在的黑客已经可以轻而易举的绕过这些函数,包括一些字符串替换 str_replace() 等,表着急,继续往下看,下面介绍的第三种防sql注入的方法还是比较实在,如果需要还是直接用下面的方法吧~

  • 利用预编译机制(mysqli 和 pdo)

一. DML语句预编译(mysqli示例和pdo示例)

使用mysqli需要开启扩展详细教程点我

      (使用pdo需要开启扩展详细教程点我)

    mysqli预编译示例

   <?php

        $mysqli = new mysqli("localhost","root","root","dbname");
$mysqli->query("set names utf8");
$sql = 'insert into user(id,name,age,email) values (?,?,?,?)';
$mysqli_stmt = $mysqli->prepare($sql); $id = 2;
$name = 'kung';
$age = 28;
$email = 'ohdas@163.com'; $mysqli_stmt->bind_param('isis',$id,$name,$age,$email); $res = $mysqli_stmt->execute(); if(!$res){
echo 'error'.$mysqli_stmt->error;
exit;
}else{
echo 'ok';
} $id = 3;
$name = 'xiaoyu';
$age = 28;
$email = 'kung-yu@163.com'; $mysqli_stmt->bind_param('isis',$id,$name,$age,$email);
$res = $mysqli_stmt->execute(); if(!$res){
echo 'error'.$mysqli_stmt->error;
exit;
}else{
echo 'ok';
}
?>

    PDO预编译示例

<?php
$dns = 'mysql:dbname=dbname;host=127.0.0.1';
$user = 'root';
$password = 'root';
try{
$pdo = new PDO($dns,$user,$password);
} catch(PDOException $e){
echo $e->getMessage();
}
$pdo->query("set names utf8"); $sql = 'inser into user values(:id,:name,:age,:email)';
$pdo_stmt = $pdo->prepare($sql); $id = 2;
$name = 'kung';
$age = 27;
$email = 'ohdas@163.com'; $pdo_stmt->bindParam(':id',$id);
$pdo_stmt->bindParam(':name',$name);
$pdo_stmt->bindParam(':age',$age);
$pdo_stmt->bindParam(':email',$email);
$pdo_stmt->execute();
?>

二. DQL语句预编译(mysqli示例)

<?php
$mysqli = new mysqli("localhost","root","root","dbname");
$mysqli->query("set names utf8");
$sql = " select id,name from user where id > ?";
$mysqli_stmt = $mysqli->prepare($sql); $id = 1;
$mysqli_stmt->bind_param('i',$id);
$mysqli_stmt->bind_result($id,$name);
$mysqli_stmt->execute(); while($mysqli_stmt->fetch()){
echo $id.'--'.$name;
} $mysqli_stmt->close();
$mysqli->close();
?>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

整篇文章内容是看慕课网视频写的笔记:   链接戳我

最后预编译的代码示例摘自:  https://blog.csdn.net/kissxia/article/details/46623097

作者:戈丫汝
版权声明:本文为博主原创文章,转载请附上博文链接!

sql注入学习笔记,什么是sql注入,如何预防sql注入,如何寻找sql注入漏洞,如何注入sql攻击 (原)的更多相关文章

  1. SAS学习笔记之《SAS编程与数据挖掘商业案例》(5)SAS宏语言、SQL过程

    SAS学习笔记之<SAS编程与数据挖掘商业案例>(5)SAS宏语言.SQL过程 1. 一个SAS程序可能包含一个或几个语言成分: DATA步或PROC步 全程语句 SAS组件语言(SCL) ...

  2. 【SQL Server学习笔记】Delete 语句、Output 子句、Merge语句

    原文:[SQL Server学习笔记]Delete 语句.Output 子句.Merge语句 DELETE语句 --建表 select * into distribution from sys.obj ...

  3. Java SQL注入学习笔记

    1 简介 文章主要内容包括: Java 持久层技术/框架简单介绍 不同场景/框架下易导致 SQL 注入的写法 如何避免和修复 SQL 注入 2 JDBC 介绍 JDBC: 全称 Java Databa ...

  4. SQL server2005学习笔记(一)数据库的基本知识、基本操作(分离、脱机、收缩、备份、还原、附加)和基本语法

    在软件测试中,数据库是必备知识,假期闲里偷忙,整理了一点学习笔记,共同探讨. 阅读目录 基本知识 数据库发展史 数据库名词 SQL组成 基本操作 登录数据库操作 数据库远程连接操作 数据库分离操作 数 ...

  5. Mysql宽字节注入 ---学习笔记

    转自:https://blog.csdn.net/niexinming/article/details/49109683 先补充一点背景:大 家都知道PHP在开启magic_quotes_gpc或者使 ...

  6. sql注入学习笔记 详解篇

    sql注入的原理以及怎么预防sql注入(请参考上一篇文章) https://www.cnblogs.com/KHZ521/p/12128364.html (本章主要针对MySQL数据库进行注入) sq ...

  7. sql注入学习笔记

    1.什么是SQL注入 SQL注入就是指web应用程序对用户输入的数据的合法性没有判断,前端传入后端的参数带有数据库查询的语句,攻击者可以构造不同的SQL语句来实现对数据库的操作. 2.SQL注入原理 ...

  8. Sql 注入----学习笔记2

    转载自:http://blog.51cto.com/quiterr/1699964 sql注入 sql注入98年第一次出现在<phrack>54期上. 注入攻击有两个关键条件,第一是用户能 ...

  9. Sql 注入----学习笔记

    先了解下CRLF,CRLF常用在分隔符之间,CR是carriage retum(ASCII 13,\r) LF是Line Feed (ASCII 10,\n), \r\n这两个字符类似于回车是用于换行 ...

随机推荐

  1. [No0000D7]img生成器.bat合并所有图片到html网页中

    @ECHO OFF IF EXIST %~nx0.html DEL /F /Q %~nx0.html ECHO ^<html^>^<head^>^<title^>% ...

  2. POJ 2299 Ultra-QuickSort 离散化加树状数组求逆序对

    http://poj.org/problem?id=2299 题意:求逆序对 题解:用树状数组.每读入一个数x,另a[x]=1.那么a数列的前缀和s[x]即为x前面(或者说,再x之前读入)小于x的个数 ...

  3. 相对定位和绝对定位 left和margin-left

    1.直接在css中设置left生效的前提是必须设置父容器position:absolute或relative,如果不设置则会以最近一个定位的父对象为参考点,.margin-left则不用设positi ...

  4. Etcd+Confd实现Nginx配置文件自动管理

    一.需求 我们使用Nginx做七层负载均衡,后端是Tomcat.项目采用灰度发布方式,每次项目升级,都要手动先从Nginx下摘掉一组,然后再升级这组,当项目快速迭代时,手动做这些操作显然会增加部署时间 ...

  5. 用NFS挂载root出现:NFS: failed to create MNT RPC client, status=-101(-110)

      2014-02-18 08:06:17 By Ly #Linux 阅读(78) 评论(0) 错误信息如下: Root-NFS: nfsroot=/home/zenki/nfs/rootfs NFS ...

  6. 内部排序->插入排序->直接插入排序

    文字描述: 将一个记录插入到已排好序的有序表中,从而得到一个新的.记录数增1的有序表 示意图: 算法分析: 时间复杂度为n*n,辅助存储为1,是稳定的排序方法. 代码实现: #include < ...

  7. jquery代码修改input的value值,而页面上input框的值没有改变的解决办法

    问题描述: 在搜索框中输入一些字符,并且点击搜索框右边的五角星做收藏操作时,打开的弹框中Save Search:后面的input中的值被赋值了外面搜索框的值,但是当此次操作完成之后,再次做同样的操作, ...

  8. SpringBoot-@async异步执行方法

    启动加上@EnableAsync ,需要执行异步方法上加入  @Async 在方法上加上@Async之后 底层使用多线程技术 演示代码: @RestController @Slf4j public c ...

  9. 自定义PopView

    改代码是参考一个Demo直接改的,代码中有一些漏洞,如果发现其他的问题,可以下方直接留言 .h文件 #import <UIKit/UIKit.h> typedef void(^Popove ...

  10. 【剑指offer】两个链表的第一个公共结点

    一.题目: 输入两个链表,找出它们的第一个公共结点. 二.思路: 思路一:模拟数组,进行两次遍历,时间复杂度O(n2) 思路二:假定 List1长度: a+n  List2 长度:b+n, 且 a&l ...