热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

sql注入学习笔记,什么是sql注入,如何预防sql注入,如何寻找sql注入漏洞,如何注入sql攻击(原)...

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

(整篇文章废话很多,但其实是为了新手能更好的了解这个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信息请求&#xff0c;获取文章id返回文章内容&#xff0c;当在get传递的id参数值后加“"”双引号&#xff0c;请求结果就会出现数据库异常错误.

        

                      <2>post请求示例&#xff0c;提交文章标题和文章内容&#xff0c;添加入库&#xff0c;正常情况是&#xff1a;

                                

                               提交入库的sql如下&#xff1a;

                               

                               但是当我们把标题输入为   标题"  &#xff0c;提交后便会触发sql异常&#xff1a;

                               

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

三.如何进行SQL注入攻击 

   &#xff08;这里介绍两种主要的sql注入攻击&#xff09;

  • 数字注入

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

   也就是上面提到的  id &#61; -1 OR 1&#61;1

  • 字符串注入

   以一个用户登陆为例:

         

                              

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

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

                             

                            

                            如上&#xff0c;用户名拼接“ ‘# ”说明&#xff1a;&#xff08; ’ 单引号用来闭合用户名的输入&#xff0c;#井号用来注释掉后面的查询条件&#xff09;

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

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

                           

                          

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

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

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

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

                    

                2.对字符串类型的参数的校验 &#xff08;正则校验&#xff09;

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

      

 

  • 过滤和转义特殊字符  

                        一.  用php函数addslashes()进行转义&#xff08;addslashes函数使用方法详解点这里&#xff09;&#xff1a;

         一般是对这些特殊字符进行转义&#xff1a;         

           1.单引号&#xff08;&#39;&#xff09;   2.双引号&#xff08;"&#xff09;  3.反斜杠&#xff08;\&#xff09; 4. NULL

                                

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

                              

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

  • 利用预编译机制&#xff08;mysqli 和 pdo&#xff09;

   一. DML语句预编译&#xff08;mysqli示例和pdo示例&#xff09;

     &#xff08;使用mysqli需要开启扩展详细教程点我&#xff09;

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

    mysqli预编译示例                                             

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

     PDO预编译示例 

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

 

          . DQL语句预编译&#xff08;mysqli示例&#xff09;

 

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

 

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

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

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

作者&#xff1a;戈丫汝
版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请附上博文链接&#xff01;

 

          

 

 

 

 

  

 

转:https://www.cnblogs.com/gyrgyr/p/9876569.html



推荐阅读
  • 深入解析Apache SkyWalking CVE-2020-9483 SQL注入漏洞
    本文详细探讨了Apache SkyWalking中的SQL注入漏洞(CVE-2020-9483),特别是其影响范围、漏洞原因及修复方法。Apache SkyWalking是一款强大的应用性能管理工具,广泛应用于微服务架构中。然而,该漏洞使得未经授权的攻击者能够通过特定的GraphQL接口执行恶意SQL查询,从而获取敏感信息。 ... [详细]
  • 本章详细介绍SP框架中的数据操作方法,包括数据查找、记录查询、新增、删除、更新、计数及字段增减等核心功能。通过具体示例和详细解析,帮助开发者更好地理解和使用这些方法。 ... [详细]
  • 掌握Spring MVC中自定义类型转换与格式化的技巧
    近期,在开发一款小程序的过程中遇到了几个Spring MVC接口需要传递时间参数的问题。本文将详细介绍如何利用Java 8 Time API在Spring MVC中实现时间参数的自定义类型转换和格式化。 ... [详细]
  • 探索Squid反向代理中的远程代码执行漏洞
    本文深入探讨了在网站渗透测试过程中发现的Squid反向代理系统中存在的远程代码执行漏洞,旨在帮助网站管理者和开发者了解此类漏洞的危害及防范措施。 ... [详细]
  • Java EE CDI:解决依赖关系冲突的实例
    在本教程中,我们将探讨如何在Java EE的CDI(上下文和依赖注入)框架中有效解决依赖关系的冲突问题。通过学习如何使用限定符,您将能够为应用程序的不同客户端提供多种接口实现,并确保每个客户端都能正确调用其所需的实现。 ... [详细]
  • 尽管PHP是一种强大且灵活的Web开发语言,但开发者在使用过程中常会陷入一些典型的陷阱。本文旨在列出PHP开发中最为常见的10种错误,并提供相应的预防建议。 ... [详细]
  • Pikachu SQL注入实战解析
    作为一名网络安全新手,本文旨在记录个人在SQL注入方面的学习过程与心得,以备后续复习之用。通过逐步深入的学习,力求掌握每个知识点后再向下一个挑战迈进。 ... [详细]
  • 本报告详细记录了在2018-2019学年网络安全技术课程中的实验过程,重点探讨了PC平台上逆向工程的基本方法和利用缓冲区溢出(BOF)漏洞的技术。通过一系列实验,加深了对计算机系统安全性的理解。 ... [详细]
  • 基于Java的学生宿舍管理系统设计
    本论文探讨了如何利用Java技术设计和实现一个高效的学生宿舍管理系统。该系统旨在提高宿舍管理的效率,减少人为错误,同时增强用户体验。通过集成用户认证、数据管理和查询功能,系统能够满足学校宿舍管理的多样化需求。 ... [详细]
  • 德国医疗设备制造商Natus的产品被发现存在严重的远程代码执行(RCE)和拒绝服务(DoS)漏洞,这些漏洞可能使攻击者能够在未授权的情况下控制设备或使其停止工作。 ... [详细]
  • 黑莓发布最新Android系统更新,修复关键安全漏洞
    黑莓近期为其多款Android设备推送了最新的安全更新,旨在解决一系列重要的系统漏洞。 ... [详细]
  • 个人用户可借鉴的企业级三大安全准则
    在数字时代,个人数据安全变得尤为重要。本文将探讨三个来自企业实践的安全原则,这些原则不仅适用于企业,也能帮助个人用户提升自身的信息安全防护水平。 ... [详细]
  • 在现代社会,学历被视为重要的个人资质证明。因此,教育机构的学历数据库成为关键的信息资源。一旦这些数据库受到攻击或数据被篡改,将极大增加假学历的识别难度。 ... [详细]
  • 自SQL Server 2005以来,微软的这款数据库产品逐渐崭露头角,成为企业级应用中的佼佼者。本文将探讨SQL Server 2008的革新之处及其对企业级数据库市场的影响。 ... [详细]
  • VMware vRealize 平台高危漏洞安全公告
    近期,VMware 发布了关于其 vRealize 平台存在服务器端请求伪造(SSRF)及任意文件上传两个严重漏洞的安全公告。这些漏洞可能导致未授权的远程代码执行,建议用户尽快采取措施进行防护。 ... [详细]
author-avatar
闻汝婕环境_259
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有