假设我们的用户表中存在一行.用户名字段为username.值为aaa.密码字段为pwd.值为pwd..

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

    1. <?php
    2. $username = "aaa";
    3. $pwd = "pwd";
    4. $sql = "SELECT * FROM table WHERE username = '{$username}' AND pwd = '{$pwd}'";
    5. echo $sql; //输出  SELECT * FROM table WHERE username = 'aaa' AND pwd = 'pwd'
    6. ?>

这样去执行这个sql语句.显然是可以查询出来东西的.返回用户的这一列.登录成功!!
然后我改一下..把密码改一下.随便一个值.如下.我改成了ppp.

    1. <?php
    2. $pwd = 'ppp';
    3. $sql = "SELECT * FROM table WHERE username = '{$username}' AND pwd = '{$pwd}'";
    4. echo $sql; //输出  SELECT * FROM table WHERE username = 'aaa' AND pwd = 'ppp'
    5. ?>

这样很显然.如果去执行这个SQL语句..是查询不到东西的.也就是密码错误.登录失败!!
但是有的人总是不老实的.他们会想尽一切办法来进行非法的登录.所谓非法就是在他不知道用户名密码的时候进行登录.并且登录成功..
那么他们所做的原理是什么呢??其实原理都是利用SQL语句..SQL语句强大的同时也给我们带来了不少麻烦..
我来举个最简单的例子.我们要运用到的SQL关键字是or
还是上面的代码.我们只要修改一下密码即可

    1. <?php
    2. $username = "aaa";
    3. $pwd = "fdsafda' or '1'='1";  //前面的密码是瞎填的..后来用or关键字..意思就是无所谓密码什么都执行
    4. $sql = "SELECT * FROM table WHERE username = '{$username}' AND pwd = '{$pwd}'";
    5. echo $sql;  //输出  SELECT * FROM table WHERE username = 'aaa' AND pwd = 'fdsafda' or '1'='1'
    6. ?>

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

SQL注入演示教程,见博文:http://blog.csdn.net/wusuopubupt/article/details/8818996

PHP为了解决这个问题.magic_quotes state..就是PHP会自动过滤传过来的GET.POST等等.
题外话.实践证明这个东西是畸形的..大部分程序不得不为判断此功能而耗费了很多代码..
在Java中可没有这个东西..那么Java中如何防止这种SQL注入呢??

Java的sql包中提供了一个名字叫PreparedStatement的类.
这个类就是我要说的绑定参数!
什么叫绑定参数??我继续给大家举例..(我用PHP举例)

    1. <?php
    2. $username = "aaa";
    3. $pwd = "pwd";
    4. $sql = "SELECT * FROM table WHERE username = ? AND pwd = ?";
    5. bindParam($sql, 1, $username, 'STRING');  //以字符串的形式.在第一个问号的地方绑定$username这个变量
    6. bindParam($sql, 2, $pwd, 'STRING');       //以字符串的形式.在第二个问号的地方绑定$pwd这个变量
    7. echo $sql;
    8. ?>

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

    1. <?php
    2. /**
    3. * 模拟简单的绑定参数过程
    4. *
    5. * @param string $sql    SQL语句
    6. * @param int $location  问号位置
    7. * @param mixed $var     替换的变量
    8. * @param string $type   替换的类型
    9. */
    10. $times = 0;
    11. //这里要注意,因为要“真正的"改变$sql的值,所以用引用传值
    12. function bindParam(&$sql, $location, $var, $type) {
    13. global $times;
    14. //确定类型
    15. switch ($type) {
    16. //字符串
    17. default:                    //默认使用字符串类型
    18. case 'STRING' :
    19. $var = addslashes($var);  //转义
    20. $var = "'".$var."'";      //加上单引号.SQL语句中字符串插入必须加单引号
    21. break;
    22. case 'INTEGER' :
    23. case 'INT' :
    24. $var = (int)$var;         //强制转换成int
    25. //还可以增加更多类型..
    26. }
    27. //寻找问号的位置
    28. for ($i=1, $pos = 0; $i<= $location; $i++) {
    29. $pos = strpos($sql, '?', $pos+1);
    30. }
    31. //替换问号
    32. $sql = substr($sql, 0, $pos) . $var . substr($sql, $pos + 1);
    33. }
    34. ?>

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

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

    1. <?php
    2. $times = 0;
    3. $username = "aaaa";
    4. $pwd = "123";
    5. $sql = "SELECT * FROM table WHERE username = ? AND pwd = ?";
    6. bindParam($sql, 1, $username, 'STRING');  //以字符串的形式.在第一个问号的地方绑定$username这个变量
    7. bindParam($sql, 2, $pwd, 'INT');       //以字符串的形式.在第二个问号的地方绑定$pwd这个变量
    8. echo $sql;  //输出  SELECT * FROM table WHERE username = 'aaaa' AND pwd = 123
    9. ?>

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

    1. <?php
    2. $times = 0;
    3. $username = "aaa";
    4. $pwd = "fdsafda' or '1'='1";
    5. $sql = "SELECT * FROM table WHERE username = ? AND pwd = ?";
    6. bindParam($sql, 1, $username, 'STRING');  //以字符串的形式.在第一个问号的地方绑定$username这个变量
    7. bindParam($sql, 2, $pwd, 'STRING');       //以字符串的形式.在第二个问号的地方绑定$pwd这个变量
    8. echo $sql; //输出  SELECT * FROM table WHERE username = 'aaa' AND pwd = 'fdsafda\' or \'1\'=\'1'
    9. ?>

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

原文地址 :http://hi.baidu.com/woyigui/item/afc6ec2efaa49f0f73863e2e

参考:http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php

[转载]mysql绑定参数bind_param原理以及防SQL注入的更多相关文章

  1. mysql绑定参数bind_param原理以及防SQL注入

    假设我们的用户表中存在一行.用户名字段为username.值为aaa.密码字段为pwd.值为pwd.. 下面我们来模拟一个用户登录的过程.. <?php $username = "aa ...

  2. 回头探索JDBC及PreparedStatement防SQL注入原理

    概述 JDBC在我们学习J2EE的时候已经接触到了,但是仅是照搬步骤书写,其中的PreparedStatement防sql注入原理也是一知半解,然后就想回头查资料及敲测试代码探索一下.再有就是我们在项 ...

  3. 【荐】PDO防 SQL注入攻击 原理分析 以及 使用PDO的注意事项

    我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答以下几个问题: 为什么要使用PDO而不是mysql_connect? 为何PDO能防注入? 使用PDO防注入的时候应该特 ...

  4. golang 防SQL注入 基于反射、TAG标记实现的不定参数检查器

    收到一个任务,所有http的handler要对入参检查,防止SQL注入.刚开始笨笨的,打算为所有的结构体写一个方法,后来统计了下,要写几十上百,随着业务增加,以后还会重复这个无脑力的机械劳作.想想就l ...

  5. PDO防 SQL注入攻击 原理分析 以及 使用PDO的注意事项

    我们都知道,只要合理正确使用PDO(PDO一是PHP数据对象(PHP Data Object)的缩写),可以基本上防止SQL注入的产生,本文主要回答以下几个问题: 为什么要使用PDO而不是mysql_ ...

  6. mysql之数据库连接的方法封装及防sql注入

    一.定义数据库和表 create database animal; CREATE TABLE `pet` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name ...

  7. 【转载】C#防SQL注入过滤危险字符信息

    不过是java开发还是C#开发或者PHP的开发中,都需要关注SQL注入攻击的安全性问题,为了保证客户端提交过来的数据不会产生SQL注入的风险,我们需要对接收的数据进行危险字符过滤来防范SQL注入攻击的 ...

  8. PHP防SQL注入不要再用addslashes和mysql_real_escape_string

    PHP防SQL注入不要再用addslashes和mysql_real_escape_string了,有需要的朋友可以参考下. 博主热衷各种互联网技术,常啰嗦,时常伴有强迫症,常更新,觉得文章对你有帮助 ...

  9. JDBC及PreparedStatement防SQL注入

    概述 JDBC在我们学习J2EE的时候已经接触到了,但是仅是照搬步骤书写,其中的PreparedStatement防sql注入原理也是一知半解,然后就想回头查资料及敲测试代码探索一下.再有就是我们在项 ...

随机推荐

  1. Shell编程实践之批量安装JDK

    实验环境 只有两台机子,一台虚拟机192.168.1.200,另外一台物理机192.168.1.201. 目标 执行一个shell脚本,给这两台机子自动安装jdk. 实验步骤 1.自动设置ssh免密码 ...

  2. 聊聊属性方法property的用法

    写之前随便百度了一下博客,又看到廖雪峰的博客了.果然置顶的能力很强. 我想说其实property的用法并不是主要用来做类型检查.反而更多应该是用于简化操作的目的. 写之前想聊一个古老的话题.年初的时候 ...

  3. Apache反向代理的配置

    Apache反向代理的配置 一: Mac系统自带apache服务器 1. 查看apache版本命令如下:   sudo apachectl -v 2. 启动apache   sudo apachect ...

  4. SignalR简单Demo

    我们实现一个简单的消息通知的Demo 在NuGet中添加SignalR引用 install-package Microsoft.AspNet.SignalR 然后我们创建一个类来引用Hub类 name ...

  5. 《Spark大数据处理:技术、应用与性能优化》【PDF】

    内容简介 <Spark大数据处理:技术.应用与性能优化>根据最新技术版本,系统.全面.详细讲解Spark的各项功能使用.原理机制.技术细节.应用方法.性能优化,以及BDAS生态系统的相关技 ...

  6. JavaScript闭包基本概念

    闭包的概念 维基百科中是这么解释闭包的: 计算机科学中,闭包(也称为词法闭包或函数闭包)是指一个函数或函数的引用,与一个引用环境绑定在一起.这个函数环境是一个存储该函数每个非局部变量(也叫自由变量)的 ...

  7. JavaScript基础5——关于ECMAscript的函数

    ECMAScript的函数概述(一般定义到<head>标签之间) (1)定义函数,JavaScript一般有三种定义函数方法: *第一种是使用function语句定义函数(静态方法) fu ...

  8. CJOJ 免费航班

    Description 小Z在MOI比赛中获得了大奖,奖品是一张特殊的机 票.使用这张机票,可以在任意一个国家内的任意城市之间的免费飞行,只有跨国飞行时才会有额外的费用.小Z获得了一张地图,地图上有城 ...

  9. 模板引擎(smarty)知识点总结II

    今天咱们继续来学习smarty!!! 知识点1:对于三种变量 常量的引用 有哪三种变量?a.assign赋值 b.系统保留变量(包括:$smarty.get,$smarty.post,$smarty. ...

  10. Expression Blend4安装破解

    先在官网上下载Expression Blend4试用版 首先进入微软下载中心,http://www.microsoft.com/zh-cn/download/default.aspx: 搜索Expre ...