(整篇文章废话很多,但其实是为了新手能更好的了解这个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. CH 1601 - 前缀统计 - [字典树模板题]

    题目链接:传送门 描述给定 $N$ 个字符串 $S_1,S_2,\cdots,S_N$,接下来进行 $M$ 次询问,每次询问给定一个字符串 $T$,求 $S_1 \sim S_N$ 中有多少个字符串是 ...

  2. 3-idiots hdu4609 母函数+FFT 组合数学题

    http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意:1e5个数,求取三个数能形成三角形的概率. 题解(这怎么会是fft入门题QAQ): 概率的算法就是三 ...

  3. 【每日一题】 UVA - 340 阅读理解+模拟

    https://cn.vjudge.net/problem/UVA-340 题目很难读,差不多读了两天 意思是给你一个n个数的数列,然后有m个询问,每个询问也是一个n个数的数列,让你输出两个数:一个是 ...

  4. screen基本用法

    当某些命令执行时间过长或者某些程序关闭shell后自动断开时,就能使用screen 1.安装yum -y install screen 2.输入screen命令进入screen控制台 3.输入scre ...

  5. inotifywait实现目录监控--http://man.linuxde.net/inotifywait

    sudo apt install inotify-tools while inotifywait -q -r -e create,delete,modify,move,attrib --exclude ...

  6. Java8 in action

    解决的问题: behavior parameterization,即可以把一段code,逻辑作为参数传入: 这样做的目的,当然为了代码抽象和重用,把变化的逻辑抽象出去: 在java中,如果要实现beh ...

  7. 转载:SDWebImage支持URL不变时更新图片内容

    转载 http://blog.handy.wang/blog/2016/01/29/sdwebimagehuan-cun-zhi-tu-pian-urlbu-bian/ SDWebImage在iOS项 ...

  8. Python接口自动化【requests处理Token请求】

    首先说一下使用python模拟登录或注册时,对于带token的页面怎么登录注册模拟的思路: 1.对于带token的页面,需要先从最开始的页面获取合法token 2.然后使用获取到的合法token进行后 ...

  9. 微信6.7.4 ios12 软键盘收回时页面不回弹,导致光标位置错乱,再次点击输入框区域时无法focus

    https://developers.weixin.qq.com/community/develop/doc/00044ae90742f8c82fb78fcae56800 https://blog.c ...

  10. 关于安装SVN Service 出错 Service 'VisualSVN Server' failed to start. Please check VisualSVN Server log in Event Viewer for more details

    关于安装SVN Service 出错 Service 'VisualSVN Server' failed to start. Please check VisualSVN Server log in ...