好久没写技术博客,最近研究产品关于用户体验方面较多,加上项目突然比较多,设计原型、跟进开发、设计师等工作着实没时间写博客。
  接下来技术上主要php深入学习和mysql优化。这两天看了关于sql注入方面的知识,拿出来分享一下 :)
  
登录注入
 

  
  先看一个我们一般用的登录页面sql语句(原生态php执行的sql)
$sql = "select * from users where username = '$username' and password = '$password'";

  对于这种sql,对应一个万能密码和用户名:

    万能密码: xx' or 1='1
    万能用户名: xx' union select * from users/*
   执行时mysql解释为:
$sql = select * from users where username = '$username' and password = ' xx' or 1=''

  不解释,瞬间破解

  同样,上面是在sql语句中查询字段后的输入值加了单引号,有些时候尤其是初级程序员经常对变量不加单引号:

$sql = "select * from users where username = $username and password = $password";    

  这时mysql解释会被当做数字型字段来匹配

     万能密码: 11 union select * from users/*
   执行语句:
select * from users where username = 11 union select * from users/* and password = 54
 
查询注入
 

  
  这个比较好理解,一般在页面的搜索框点击按钮搜索时在后台sql中可能会用like来查询,但如果没有加任何处理,可能输入一个% 或 __ 就会注入到sql中查询全部或部分记录,不过在php中可以使用一个函数来处理一下:
$keyword = addslashes($keyword);
$keword = str_replace("%","\$",$kwyword);

插入注入
 

  
  我们先模拟一个网站注册页面的sql处理语句:
insert into users(username,password,grade) values('frank','','');
  假如users表中grade为等级字段,并且默认字段为1,注册时用户输入用户名和密码两个字段后,后台插入语句为上面语句,则当用户输入的密码为 123456','3')/*时,执行sql为:
insert into users(username,password,grade) values('frank','','')/*,'1';
  这样也可以达到注入的目的
 
 
解决sql注入: 
 

     
  ①. 在服务器设置将php.ini配置文件中magic_quotes_gpc设置为On
          服务器会自动将单引号转义为:\'
          不过攻击时可以将单引号写为char(13)-单引号ASCII码,也一样可以攻击
 
     ②. 密码比对
          通过输入的用户名获取密码,再对密码进行匹配
          $sql  = "select * from users where username ='frank'"
          $result = mysql_query($sql,$conn);
          $row = mysql_fetch_array($result);
          if($row['password'] != $password) ...
 
     ③. 使用pdo的PDO::prepare()预处理操作
          PDO(PHP Data Object)扩展在PHP5中加入,PHP6默认识别PDO连接数据库,pdo相当于是一个数据库抽象层,不同数据库使用相同的方法名,解决数据库连接不同意问题。
          工作原理如下:
               
         (使用时需先在php.ini中开启对pdo扩展的支持)
      $sql = "select * from users where username=? and password=?";
//创建一个pdo对象
$mypdo = new PDO("mysql:host=localhost;port=3306;dbname=xx","root","123456");
//设置编码
$mypdo->exec("set names utf8"); //预处理$sql
$pdostatement = $mypdo->prepare(%sql);
//将用户名和密码填入sql
$pdostatement->execute(array($username,$password)); //得到查询结果
$result = $pdostatement->fetch(); if(empty($result)) ...
     ④. 其他企业级解决sql注入方式:IDS(入侵检测系统)
 
          
 
  关于sql注入对于开发工程师来说主要是防守,提高编写安全代码的意识,让我们编写的代码质量更高,安全性方面更好。

sql注入一点小心得的更多相关文章

  1. SQL语句一点小心得

    在Sqlserver中 if 语句后面的语句加begin end 括起来 问题:执行速度问题,在存储过程中没有加begin end 执行速度很慢,加了begin end执行速度加快 ALTER PRO ...

  2. BUI Webapp用于项目中的一点小心得

    接触BUI也有一段时间,也用在了移动端的项目开发中,总的来说,该框架用起来也挺灵活的,控件可以自由定制,前提是自己能认真地学习该框架的api,因为api里面说的东西比较详细,如果没有仔细看的,可能有些 ...

  3. ASP.NET MVC Autofac依赖注入的一点小心得(包含特性注入)

    前言 IOC的重要性 大家都清楚..便利也都知道..新的ASP.NET Core也大量使用了这种手法.. 一直憋着没写ASP.NET Core的文章..还是怕误导大家.. 今天这篇也不是讲Core的 ...

  4. Qt使用com组件的一点小心得(使用Qt自带的工具dumpcpp生成.h和.cpp文件)

    这几天工作中要用到Qt调用com组件,主要用到的类型有dll和ocx,使用他们的方法很简单:1.将com组件注册到系统中.2.使用Qt自带的工具dumpcpp将com组件生成cpp和头文件.3.然后就 ...

  5. python+tesseract验证码识别的一点小心得

    由于公司需要,最近开始学习验证码的识别 我选用的是tesseract-ocr进行识别,据说以前是惠普公司开发的排名前三的,现在开源了.到目前为止已经出到3.0.2了 当然了,前期我们还是需要对验证码进 ...

  6. 学习KMP算法的一点小心得

    KMP算法应用于 在一篇有n个字母的文档中 查找某个想要查找的长度为m的单词:暴力枚举:从文档的前m个字母和单词对比,然后是第2到m+1个,然后是第3到m+2个:这样算法复杂度最坏就达到了O(m*n) ...

  7. 近日使用Taro框架的一点小心得

    1.yarn npm安装的包,跟权限问题有关,与网络也有关 2.Vue框架首先,是解决了view-model的问题,解放开发的双手,使得显示和数据和控制分开 3.当你觉得最近没有技术文章看时,就看收藏 ...

  8. jquery框架一点小心得

    下面的小事例 主要实现了 一和按ID查找,并获取元素的 value 或 标签内容和一个去字符串空格的小功能能 假设元素id=“myid”: 获取标签内容$("myid").html ...

  9. 学习R语言的一点小心得

    1.目前R 语言处于入门阶段吧,能够执行一些简单的模型了,还是有收获的. 但是在跑模型的时候经常遇到各种各样的错误,最常见的错误就是数据带入模型之后,数据的类型不对,因此模型跑不下去,因此说,利用he ...

随机推荐

  1. 训练DCGAN(pytorch官网版本)

    将pytorch官网的python代码当下来,然后下载好celeba数据集(百度网盘),在代码旁新建celeba文件夹,将解压后的img_align_celeba文件夹放进去,就可以运行代码了. 输出 ...

  2. day--41 mysql索引原理与慢查询优化

    mysql索引原理与慢查询优化一:什么是索引 01:索引的出现是为了提高查询数据的效率 02:索引在mysql叫做“键” 或则“key“(primary key,uniquekey ,还有一个inde ...

  3. tornado 07 数据库—ORM—SQLAlchemy—查询

    tornado 07 数据库—ORM—SQLAlchemy—查询 引言 #上节课使用query从数据库查询到了结果,但是query返回的对象是直接可用的吗 #在query.py内输入一下内容 from ...

  4. node.js express 启用 https

    服务端和客户端各有一对公钥和私钥,使用公钥加密的数据只能用私钥解密,建立https传输之前,客户端和服务端互换公钥.客户端发送数据前使用服务端公钥加密,服务端接收到数据后使用私钥解密,反之亦如此. 公 ...

  5. CodeForces - 645D Robot Rapping Results Report(拓扑排序)

    While Farmer John rebuilds his farm in an unfamiliar portion of Bovinia, Bessie is out trying some a ...

  6. C++_类和动态内存分配6-复习各种技术及队列模拟

    知识点: 队列:是一种抽象的数据类型(Abstract Data Type),可以存储有序的项目序列. 新项目被添加在队尾,并可以删除队首的项目.队列有些像栈.栈是在同一端进行添加和删除.这使得栈是一 ...

  7. ubuntu画面延迟问题解决

    新配的电脑,安装ubuntu16.04以后,出现画面延迟的问题,尤其浏览网页的时候画面十分卡顿.用free命令查看过可用内存6.多G,经过询问大概是显卡问题,然后在https://ubuntuforu ...

  8. abp架构添加实体并使用迁移功能生成表

    参考: https://aspnetboilerplate.com/Pages/Articles/Introduction-With-AspNet-Core-And-Entity-Framework- ...

  9. UESTC - 1610 递推方程+矩阵快速幂

    感觉像是HDU Keyboard的加强版,先推出3张牌时的所有组合,然后递推出n张牌 看到n=1e18时吓尿了 最后24那里还是推错了.. (5行1列 dp[1][n],dp[2][n],dp[3][ ...

  10. Vue如何封装多个全局过滤器到一个文件

    #### 在写vue项目时,所用的过滤器很多时,把所有的过滤器方法封装在一个文件中,然后导出,并绑定在vue实例上 1.在src下创建filters文件夹,并新建index.js文件 2. index ...