详见 https://stackoverflow.com/questions/134099/are-pdo-prepared-statements-sufficient-to-prevent-sql-injection/12202218#12202218

php pdo prepare真的能防止sql injection吗, 这里

php使用pdo 连接mysql , 会使用prepare预处理, 也就是将 除去具体查询值的SQL语句先送给mysql, 然后再把值发送给mysql, 能够避免sql注入

pdo  有一个属性 PDO::ATTR_EMULATE_PREPARES, 为true, 即为php本地 模拟这个prepare, 其时什么也没做,execute时把完整sql 发送给sql, 这时如果是gbk,很容易SQL注入

为false时,先把预处理发送给mysql, execute时, 再把值发送给mysql

当 PDO::ATTR_EMULATE_PREPARES 为 true时

当PDO::ATTR_EMULATE_PREPARES 为 false时

先发送 select * from table_uid_1 where k = ?

再发送103489 这个查询值

如果加上limit

public  function list() {
$sql = "select * from " . $this->table . "_1 where k = :id limit :limit";
$result = $this->pdo->prepare($sql);
$id = ;
$result->bindParam(':id', $id);
$result->bindValue(':limit', );
$result->execute();
$list = $result->fetchAll(\PDO::FETCH_ASSOC);
return $list;
}

当 PDO::ATTR_EMULATE_PREPARES 为 true时, sql报错

执行的语句是 select * from table_uid_1 where k = '103489' limit '0'

解决方法是 bindValue时, 标注下类型, 即

public  function list() {
$sql = "select * from " . $this->table . "_1 where k = :id limit :limit";
$result = $this->pdo->prepare($sql);
$id = ;
$result->bindParam(':id', $id);
$result->bindValue(':limit', , \PDO::PARAM_INT);
$result->execute();
$list = $result->fetchAll(\PDO::FETCH_ASSOC);
return $list;
}

或者 设置 PDO::ATTR_EMULATE_PREPARES 为 false

传递 值

tcpdump抓取数据

  tcpdump tcp port 3318 -w /tmp/target.ca

wireshark 分析tcpdump出来的包 分析

过滤条件:

在wireshark的过滤条件里输入tcp.port==3306 && mysql,然后回车,这样就能只显示mysql类型的包。

php prepare的更多相关文章

  1. Looper.prepare()和Looper.loop()

    什么时候需要 Looper Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建 ...

  2. java.lang.NoSuchMethodException: org.apache.ibatis.executor.statement.StatementHandler.prepare(java.sql.Connection)

    此错误是由于版本造成的,如果使用mybatis3.4版本以上,配置拦截器规则应增加Intger @Intercepts({ @Signature( type= StatementHandler.cla ...

  3. php+mysql预查询prepare 与普通查询的性能对比

    prepare可以解决大访问量的网站给数据库服务器所带来的负载和开销,本文章通过实例向大家介绍预查询prepare与普通查询的性能对比,需要的朋友可以参考一下. 实例代码如下: <?php cl ...

  4. 在子线程中new Handler报错--Can't create handler inside thread that has not called Looper.prepare()

    在子线程中new一个Handler为什么会报以下错误? java.lang.RuntimeException:  Can't create handler inside thread that has ...

  5. PerconaXtraBackup --全备增备prepare restore

    Xtrabackup Xtrabackup包含两个主要的工具,即xtrabackup和innobackupex,二者区别如下:  • xtrabackup只能备份innodb和xtradb引擎表,而不 ...

  6. 1117Mysql prepare预处理语句

    转自http://www.jb51.net/article/81378.htm 综述:一般用来拼凑SQL然后执行 MySQL 5.1对服务器一方的预制语句提供支持.如果您使用合适的客户端编程界面,则这 ...

  7. DB2 for Z/os Statement prepare

    The PREPARE statement creates an executable SQL statement from a string form of the statement. The c ...

  8. Android 线程更新UI报错 : Can't create handler inside thread that has not called Looper.prepare()

    MainActivity中有一个按钮,绑定了save方法 public void save(View view) { String title = titleText.getText().toStri ...

  9. Mariadb 10.1 joiner节点加入报错WSREP: Failed to prepare for incremental state transfer

    Mariadb 10.1 galera cluster 集群joiner 节点加入集群 会出现这种报错,导致mysql一直点点点,这里我贴出报错.2016年04月19日13:34:58 2016-04 ...

  10. mysql之预处理语句prepare、execute、deallocate

    预制语句的SQL语法基于三个SQL语句: PREPARE stmt_name FROM preparable_stmt; EXECUTE stmt_name [USING @var_name [, @ ...

随机推荐

  1. 49. Group Anagrams (string, HashTable)

    Given an array of strings, group anagrams together. For example, given: ["eat", "tea& ...

  2. python操作vmware

    import pysphere from pysphere import VIServer host_ip = "200.200.173.45" username = " ...

  3. [IIS] 测试的产品登陆之后有个引用外部站点js的请求半天都无法返回,导致网页一直在打转,Selenium的driver也无法对页面进行下一步的操作

    测试的产品登陆之后有个引用外部站点js的请求半天都无法返回: https://cdn.heapanalytics.com/js/heap-3497400264.js 这个js如果是在美国的机器上就可以 ...

  4. Effective Java 中文版

    始读于2014年8月2日10:15,整理完成于2014年8月20日23:14:42 一图一世界,<Effective Java >是Java领域大牛Joshua Bloch的获奖之作,去年 ...

  5. 团队作业7——alpha阶段之事后诸葛亮分析

    事后诸葛亮分析 1. 设想和目标 1.1 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 解决查询物流信息步骤繁琐的问题.定义还算清楚.典型用户主要针对一些不熟悉淘 ...

  6. 看图说说class文件结构(部分)

  7. swift学习之-- UIAlertViewController -alert

    // //  ViewController.swift //  alertView // //  Created by su on 15/12/7. //  Copyright © 2015年 tia ...

  8. Linux 基础教程 29-tcpdump命令-1

    什么是tcpdump     在Linux中输入命令man tcpdump给出的定义如下所示: tcpdump - 转储网络上的数据流 是不是感觉很懵?我们用通俗.形象.学术的表达方式来全方位描述tc ...

  9. SqlServer 的一个坑

    以前一直以为sqlserver 在做ddl 操作的时候是锁表的,而oracle 是锁行,感觉oracle 要比sqlserver 先进一些,但是这是我的认识错误.其实sqlserver 也是可以锁行的 ...

  10. tomcat启动时就频繁gc和full gc

    一个小业务,流量并不大,功能也很简单,spring framework+mybatis+quartz,一启动就看到gc的频次和full gc的频次非常高: 4.202: [Full GC 4.202: ...