下面我们来模拟一个用户登录的过程..

$username = "aaa";

$pwd = "pwd";

$sql = "SELECT * FROM table WHERE username = '{$username}' AND pwd = '{$pwd}'";

echo $sql; //输出 SELECT * FROM table WHERE username = 'aaa' AND pwd = 'pwd'

?>

这样去执行这个sql语句.显然是可以查询出来东西的.返回用户的这一列.登录成功!!

然后我改一下..把密码改一下.随便一个值.如下.我改成了ppp.

$pwd = 'ppp';

$sql = "SELECT * FROM table WHERE username = '{$username}' AND pwd = '{$pwd}'";

echo $sql; //输出 SELECT * FROM table WHERE username = 'aaa' AND pwd = 'ppp'

?>

这样很显然.如果去执行这个SQL语句..是查询不到东西的.也就是密码错误.登录失败!!

但是有的人总是不老实的.他们会想尽一切办法来进行非法的登录.所谓非法就是在他不知道用户名密码的时候进行登录.并且登录成功..

那么他们所做的原理是什么呢??其实原理都是利用SQL语句..SQL语句强大的同时也给我们带来了不少麻烦..

我来举个最简单的例子.我们要运用到的SQL关键字是or

还是上面的代码.我们只要修改一下密码即可

$username = "aaa";

$pwd = "fdsafda' or '1'='1"; //前面的密码是瞎填的..后来用or关键字..意思就是无所谓密码什么都执行

$sql = "SELECT * FROM table WHERE username = '{$username}' AND pwd = '{$pwd}'";

echo $sql; //输出 SELECT * FROM table WHERE username = 'aaa' AND pwd = 'fdsafda' or '1'='1'

?>

执行一下这个SQL语句..可怕的事情发生了..竟然可以查询到这一行数据..也就是登录成功了..

这是多么可怕的事情..

PHP为了解决这个问题.magic_quotes state..就是PHP会自动过滤传过来的GET.POST等等.

题外话.实践证明这个东西是畸形的..大部分程序不得不为判断此功能而耗费了很多代码..

在Java中可没有这个东西..那么Java中如何防止这种SQL注入呢??

Java的sql包中提供了一个名字叫PreparedStatement的类.

这个类就是我要说的绑定参数!

什么叫绑定参数??我继续给大家举例..(我用PHP举例)

$username = "aaa";

$pwd = "pwd";

$sql = "SELECT * FROM table WHERE username = ? AND pwd = ?";

bindParam($sql, 1, $username, 'STRING'); //以字符串的形式.在第一个问号的地方绑定$username这个变量

bindParam($sql, 2, $pwd, 'STRING'); //以字符串的形式.在第二个问号的地方绑定$pwd这个变量

echo $sql;

?>

当然.到此.你肯定不知道会输出什么..更无法知道绑定参数有什么好处!这样做的优势是什么.更不知道bindParam这个函数到底做了什么.

下面我简单的写一下这个函数:

/**

* 模拟简单的绑定参数过程

*

* @param string $sql SQL语句

* @param int $location 问号位置

* @param mixed $var 替换的变量

* @param string $type 替换的类型

*/

$times = 0;

//这里要注意,因为要“真正的"改变$sql的值,所以用引用传值

function bindParam(&$sql, $location, $var, $type) {

global $times;

//确定类型

switch ($type) {

//字符串

default: //默认使用字符串类型

case 'STRING' :

$var = addslashes($var); //转义

$var = "'".$var."'"; //加上单引号.SQL语句中字符串插入必须加单引号

break;

case 'INTEGER' :

case 'INT' :

$var = (int)$var; //强制转换成int

//还可以增加更多类型..

}

//寻找问号的位置

for ($i=1, $pos = 0; $i<= $location; $i++) {

$pos = strpos($sql, '?', $pos+1);

}

//替换问号

$sql = substr($sql, 0, $pos) . $var . substr($sql, $pos + 1);

}

?>

注:由于得知道去除问号的次数..所以我用了一个global来解决.如果放到类中就非常容易了.弄个私有属性既可

通过上面的这个函数.我们知道了..绑定参数的防注入方式其实也是通过转义进行的..只不过是对于变量而言的..

我们来做一个实验:

$times = 0;

$username = "aaaa";

$pwd = "123";

$sql = "SELECT * FROM table WHERE username = ? AND pwd = ?";

bindParam($sql, 1, $username, 'STRING'); //以字符串的形式.在第一个问号的地方绑定$username这个变量

bindParam($sql, 2, $pwd, 'INT'); //以字符串的形式.在第二个问号的地方绑定$pwd这个变量

echo $sql; //输出 SELECT * FROM table WHERE username = 'aaaa' AND pwd = 123

?>

可以看到.生成了非常正规的SQL语句.那么好.我们现在来试下刚才被注入的那种情况

$times = 0;

$username = "aaa";

$pwd = "fdsafda' or '1'='1";

$sql = "SELECT * FROM table WHERE username = ? AND pwd = ?";

bindParam($sql, 1, $username, 'STRING'); //以字符串的形式.在第一个问号的地方绑定$username这个变量

bindParam($sql, 2, $pwd, 'STRING'); //以字符串的形式.在第二个问号的地方绑定$pwd这个变量

echo $sql; //输出 SELECT * FROM table WHERE username = 'aaa' AND pwd = 'fdsafda\' or \'1\'=\'1'

?>

可以看到.pd内部的注入已经被转义.当成一个完整的字符串了..这样的话.就不可能被注入了.

转于http://blog.csdn.net/wusuopubupt/article/details/9668501

mysql bind param_mysql绑定参数bind_param原理以及防SQL注入相关推荐

  1. php7 mysql防注入_php如何防sql注入?

    SQL注入(SQLi)是一种注入攻击,,可以执行恶意SQL语句.它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器. 攻击者可以使用SQL注入漏洞绕过应用程序安 ...

  2. 原理+实战掌握SQL注入方法

    本文首发于先知社区 原理+实战掌握SQL注入方法 前言: SQL注入是web安全中最常见的攻击方式,SQL注入有很多方法,但如果只知道payload,不知道原理,感觉也很难掌握,这次就总结一下我所遇到 ...

  3. php mysql 防 sql注入_php 防sql注入方法

    php防sql注入的方法:1.使用mysql_real_escape_string方法转义SQL语句中使用的字符串中的特殊字符:2.打开magic_quotes_gpc来防止SQL注入:3.通过自定义 ...

  4. mysql存储过程不常用_Python--day46--mysql存储过程(不常用)(包含防sql注入)

    一.存储过程: 优点:只要传很少的数据到数据库就可以了  缺点:dba管理数据库的时候可能会对数据库进行了更改了那一坨sql语句. 二.创建存储过程: 1.简单 创建存储过程: Python中使用结果 ...

  5. SQL注入原理及预防SQL注入的方法

    网络安全成为了现在互联网的焦点,这也恰恰触动了每一位用户的神经,担心网上的信息以及个人隐私遭到泄露.下面要为大家介绍的是SQL注入,对于sql注入,相信程序员都知道或者使用过,如果没有了解或完全没有听 ...

  6. 使用ADO.NET的参数集合来有效防止SQL注入漏洞

    SQL注入漏洞是个老话题了,在以前做ASP做开发时,就经常需要用字符串的过虑等方式 来解决这个问题,但有时候确做的不够彻底,往往让***钻了空子. 那么目前在我们.NET中,不管是用WINFORM开发 ...

  7. mysql 漏洞 wa_[漏洞案例]thinkcmf 2.x从sql注入到getshell实战

    文章中提到了三个漏洞,一个注入,两个模板注入写shell. 但是系统是部署在linux下面的,模板注入是不行的. 所以文章编辑处的sql注入漏洞是比较好的方法了. 但是这里的注入需要登陆. 虽然网站默 ...

  8. pdo mysql ascii_跟bWAPP学WEB安全(PHP代码)--SQL注入的一些技巧

    背景 模拟环境还是 bWAPP,只不过这个bWAPP的SQL注入有点多,一一写意义不大,在这边就利用这个环境来尝试一些SQL注入的技巧.并研究下PHP的防御代码. 普通的bWAPPSQL注入的简单介绍 ...

  9. mysql%3e= %3c=某个时间_乐视网某站SQL注入3枚

    乐视网某站sql注入一枚 http://ad.hz.letv.com/CJO/php/Save_ad_wph_cmt.php?remark=wph&name=1&text=%3Cinp ...

最新文章

  1. 小米回应暴力裁员:已提前三个月通知不续签合同,并且给了N+1补偿
  2. Eureka集群搭建,unavailable-replicas服务节点不可用解決方案
  3. 第一章1.1 回顾CMOS的一些知识
  4. Windows 环境下载安装Docker
  5. 53、shell常用快捷方式
  6. scala 加载与保存xml文档
  7. 深度学习(3)手写数字识别问题
  8. 揭秘!微软 Build 2020 开发者大会将启,邀您共赴线上新旅程
  9. jzoj1764-游戏【dp,dfs】
  10. java netty html_源码时代JAVA干货分享|带你用Netty框架实现WebSocket通信
  11. 【.Net】C#实现多线程的方式:使用Parallel类
  12. python全栈工程师要求_Python全栈工程师
  13. 算法学习第一天-搭建能运行算法第四版的代码
  14. 多元统计分析朱建平pdf_应用多元统计分析 朱建平.pdf
  15. 百度经纬度与高德经纬度互转
  16. cer pem 证书转换_Cer Crt Pem Pfx 证书格式转换
  17. Win系统 - 系统双击文件总弹出属性窗口如何解决?
  18. android wifi驱动加载失败怎么办,wifi驱动无法被安卓系统正常调用
  19. MariaDB数据库的备份和还原
  20. 《星际争霸》怀念星际历史上最强的队伍系列三

热门文章

  1. 95-235-040-源码-task-Flink 对用户代码异常处理
  2. 【Java】MANIFEST.MF是什么
  3. Spring :事务使用的注意事项
  4. 【安全】JAAS/GSS-API/SASL/Kerberos简介
  5. 数据结构知识点大汇总(三)
  6. 一个让程序员男友记住一辈子的 IntelliJ IDEA 插件!
  7. 跳槽了,但是面试官问的总答不到点上……
  8. 从数组到 HashMap 之算法解释
  9. 表空间(tableSpace) 段(segment) 盘区(extent) 块(block) 关系
  10. 思维导图Vue组件 mindmap