Php PDO bindValue不转义
有些奇怪的事情正在发生,因为PDO应该逃逸任何XSS 这是我的PDO课程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
<?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();