Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO bindValue不转义_Php_Mysql_Pdo - Fatal编程技术网

Php PDO bindValue不转义

Php PDO bindValue不转义,php,mysql,pdo,Php,Mysql,Pdo,有些奇怪的事情正在发生,因为PDO应该逃逸任何XSS 这是我的PDO课程 <?php class Database { private $host = 'localhost'; private $user = 'root'; private $pass = ''; private $dbname = ''; private static $_instance; private $dbh; private $stmt; pr

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

这是我的PDO课程

<?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());
        }
    }
}
?>
“>”>“>”>警报(1)不会转义输入


…那么PDO有什么问题呢???

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

  • 当攻击者诱使您的代码生成对您的数据有副作用的SQL字符串时,就会发生SQL注入。例如,通过操纵动态WHERE子句来执行DROP TABLE语句
  • 当攻击者诱使您的代码生成包含您不希望的其他元素的HTML时,就会发生HTML注入,可能包括在用户浏览器上执行脚本
  • 当动态构建JS本身时,JS注入再次遵循类似的模式
针对所有这些问题的缓解措施都是类似的——要么将数据与代码隔离,使其永远无法执行,要么对可能“脱离”预期标记的特殊字符进行转义。但是,没有一组转义可以使字符串在所有上下文中都是安全的,您必须为正在使用它的上下文以正确的方式进行准备


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

PDO除了SQL上下文(如果有的话)外不会转义。必须转义输出。PDO没有理由不保存字符串警报(1);“@Don'tPanic stackoverflow已删除标记…”。。。哦了解了!谢谢PDO没有理由不用标签保存它。这只是一根绳子。在使用类似
htmlspecialchars
的输出时,必须对其进行转义,以防止出现这种情况。
        $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();