我看书上说如果采用prepare 和execute 方法,还可以防止SQL 注入等攻击。因为所有的变量都会
被自动转义。
然后我在表单中输入df'dfdf",结果不能输入数据。
SQL语句:INSERT INTO cms_manage( admin_user, admin_pass, level, last_time ) VALUES( 'df'dfdf"', 'da39a3ee5e6b4b0d3255bfef95601890afd80709', '6', NOW() )
错误信息:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'dfdf"', 'da39a3ee5e6b4b0d3255bfef95601890afd80709', ' at line 9
当我把数据df'dfdf"用mysql_real_escape_string函数转义后,就成功了,到底prepare 和execute能不能自动转义了,是不是还要手动转义。 

解决方案 »

  1.   

    当然能!
    不过你只贴出了 sql 指令,并没用有 prepare 和 execute 方法
      

  2.   

    我认为是你代码的问题,PDO的prepare() execute()组合的确能预防SQL注入。
      

  3.   

    //增删修数据
    protected function _aud($_sql){
    $_stmt=$this->execute($_sql);
    return $_stmt->rowCount();
    }

    //执行SQL
    private function execute($_sql){
    try{
    $_stmt=$this->_pdo->prepare($_sql);
    $_stmt->execute();
    } catch (PDOException $e){
    exit('SQL语句:'.$_sql.'<br/>错误信息:'.$e->getMessage());
    }
    return $_stmt;
    }
    以上就是我的prepare和execute方法,没有错啊,数据查询和增删修都可以,就是不能自动转义。
      

  4.   

    想想看,你的代码中
    $_stmt=$this->_pdo->prepare($_sql);
    $_stmt->execute(); //这句似乎是多余的?PDO的设计者为什么要这么设计
    // PDO会对 execute()和bindParam() 的参数转义,而不是对prepare的参数智能的转义
    // 正确使用的例子
    $_sql = "SELECT * FROM `hello` WHERE `world` = ?"; // ? 周围不用加引号,PDO会帮你加上
    $_stmt=$this->_pdo->prepare($_sql);
    $_stmt->execute( array("你好'世界") );
    http://php.net/manual/en/pdostatement.execute.php