首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PDO bindValue不逃逸

PDO bindValue不逃逸
EN

Stack Overflow用户
提问于 2015-04-27 23:10:27
回答 1查看 585关注 0票数 1

有些奇怪的事情正在发生,因为PDO应该避开任何XSS。

这是我的PDO课程

代码语言:javascript
复制
<?php
class Database {
    private $host = 'localhost';
    private $user = 'root';
    private $pass = '';
    private $dbname = '';

    private static $_instance;

    private $dbh;
    private $stmt;
    private $error;

    private function __construct() {
        if($this->dbh != null)
            return $this->dbh;

        $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
        $options = array(
            PDO::ATTR_PERSISTENT => true,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING, //ERRMODE_SILENT
            PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
        );
        try {
            $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
        }
        catch(PDOException $e) {
            echo '__construct -> ';
            var_dump($e->getMessage());
        }
    }
    private function __clone(){
    }

    public static function getInstance() {
        if(!self::$_instance) {
            self::$_instance = new Database();
        }
        return self::$_instance;
    }

    public function query($query) {
        try {
            $this->stmt = $this->dbh->prepare($query);
        }
        catch(PDOException $e) {
            echo 'query -> ';
            var_dump($e->getMessage());
        }
    }

    public function bindValue($param, $value, $type) {
        $this->stmt->bindValue($param, $value, $type);
    }
    public function execute() {
        try {
            return $this->stmt->execute();
        }
        catch(PDOException $e) {
            echo 'execute -> ';
            var_dump($e->getMessage());
        }
    }
}
?>

...and这里是一个将注释插入数据库的处理程序

代码语言:javascript
复制
        $this->db->query("INSERT INTO `comments` (`user_id`, `post_id`, `text`, `added`) VALUES (:user_id, :post_id, :text, :added)");
        $this->db->bindValue(':user_id', $user_id, PDO::PARAM_INT);
        $this->db->bindValue(':post_id', $recipe_id, PDO::PARAM_INT);
        $this->db->bindValue(':text', $_POST['text'], PDO::PARAM_STR);
        $this->db->bindValue(':added', time(), PDO::PARAM_INT);
        $this->db->execute();

并且输入不以“alert‘>’>警报(1)”转义;

...so,PDO怎么了??

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-27 23:24:07

您混淆了不同类型的安全漏洞,它们具有相同的基本原则,但发生在不同的地方:

  • 当攻击者欺骗您的代码构建对您的数据有副作用的SQL字符串时,就会发生SQL注入。例如,通过操作动态WHERE子句来执行DROP语句。
  • 当攻击者欺骗您的代码构建包含您无意中的其他元素的HTML时,可能包括用户浏览器上的脚本执行,就会发生HTML注入。
  • 在动态构建JS本身时,JS注入同样遵循类似的模式。

针对所有这些问题的缓解措施类似--要么将数据与代码隔离,使其永远无法执行,要么转义将“突破”预期标记的特殊字符。但是没有一组转义操作可以使字符串对所有上下文都安全,您必须以正确的方式为您使用的上下文做好准备。

因此,在DB层中使用参数化查询可以防止SQL注入,但它与如何将数据包含在HTML、JS甚至未来的SQL调用中没有任何关系--出来的文本与输入的文本是相同的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29907550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档