好久没写技术博客,最近研究产品关于用户体验方面较多,加上项目突然比较多,设计原型、跟进开发、设计师等工作着实没时间写博客。
  接下来技术上主要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. ajax beforeSend中无效果

    asnyc:false 与beforesend 同时使用 无效果

  2. django基础知识之Response对象

    HttpResponse对象 在django.http模块中定义了HttpResponse对象的API HttpRequest对象由Django自动创建,HttpResponse对象由程序员创建 不调 ...

  3. Chrome浏览器如何完美实现滚动截图技巧

    一.前言 我们平时在浏览网页时,想把碰到好的网页内容或者文章截屏保存,但是网页的长度常常会超出屏幕高度,一般的截屏功能只能截取显示在屏幕上的内容,那我们该如何方便快捷截取全部内容?今天就分享一个如何利 ...

  4. cmd命令窗口相关操作指南

    cmd命令窗口打开方式:win+R cmd 1.盘符切换 d: 回车 (d为磁盘名) 2.查看当前目录下的文件和文件夹 输入dir 3.进入指定目录(若需跨盘符操作,应先切换盘符) cd(空格)+绝对 ...

  5. python安装环境配置、python模块添加、sublime text编辑器配置

    前提: 本文讲述的是  windows环境 python相应的安装配置. 进入官网找安装包,官网地址如下:https://www.python.org/downloads/ 找到相应2.7.x或3.x ...

  6. C++_类和动态内存分配1—动态内存和类

    静态类成员 num_strings成员声明为静态存储类.静态类成员有一个特点:无论创建了多少对象,程序都只创建一个静态类变量副本.也就是说,类的所有对象共享一个静态成员.num_strings成员可以 ...

  7. 解决分批次调用 jsonp 接口的 callback 会报错问题

    当我们分批次调用同一个jsonp接口时,会有一定机率同时调用,而jsonp的callback不支持同时调用, 会报错,所以当我们在分批次调用同一jsonp接口时,最好在callback后加个变量值,总 ...

  8. UVA - 11996 可持久化Treap 维护Hash Ver.2

    这回总算是过了.. 4600ms+,服务器抖一抖又没了 对于极端卡时间的情况还是考虑屈服于Splay吧 #include<iostream> #include<algorithm&g ...

  9. POJ - 2891 中国剩余定理

    \(mod\)存在不互素情况下的CRT #include<iostream> #include<algorithm> #include<cstdio> #inclu ...

  10. POJ - 1948 二维01背包

    T了两发,DP方程很简单粗暴 dp[i][j][k]:用前i物品使得容量分别为j和k的背包恰好装满 背包的调用只需一次即可,第一次T就是每次check都丧心病狂地背包一次 对于sum的枚举,其实i j ...