Php PDO准备-绑定值
我有一个PDO DB类,它是由一个教程制作的。 其中有一个方法在我发送insert查询时绑定值,实际上是这样的:Php PDO准备-绑定值,php,sql,pdo,Php,Sql,Pdo,我有一个PDO DB类,它是由一个教程制作的。 其中有一个方法在我发送insert查询时绑定值,实际上是这样的: public function query($sql, $params = array()){ $this->_error = false; if($this->_query = $this->_pdo->prepare($sql)){ if(count($params)){ $x = 1;
public function query($sql, $params = array()){
$this->_error = false;
if($this->_query = $this->_pdo->prepare($sql)){
if(count($params)){
$x = 1;
foreach($params as $param){
$this->_query->bindValue($x, $param);
$x++;
}
}
if($this->_query->execute()){
$this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
$this->_count = $this->_query->rowCount();
} else{
$this->_error = true;
}
}
return $this;
}
我遇到的问题是,我不太理解这个绑定是如何工作的,我发送以下查询:
DB::instance()->query("INSERT INTO table (column) VALUES (<script>alert('test');</script>)");
现在的问题是,当我在数据库表中输入警报测试,然后获取该行时,警报像一只疯狂的兔子一样跳了起来:(
我的问题是:这不是一个非常基本的sql注入吗?为什么我能够将这样的脚本输入到数据库中?如何在不实际执行该脚本的情况下显示这些值
谢谢!uu!:D代码中没有SQL注入,因为
警报('test');
不是SQL
准备好的语句只有在正确使用它们的情况下才能阻止SQL注入——它是一种可以更容易地编写安全代码的工具,而不是检查您正在做什么的灵丹妙药。您必须通过$params
数组提供所有不受信任的数据,而不是将其替换到查询中。因此,您应该:
$DB::instance()->query("INSERT INTO table (column) VALUES (?)", ["<script>alert('test');</script>"]);
要防止在HTML网页中显示列时执行Javascript,请使用htmlentities()
:
这可以防止跨站点脚本(XSS)攻击。您的查询不是有效的SQL,它需要在
alert('test');)周围加引号。
插入表(列)值(alert('test');)
是伪查询吗?如果您想知道为什么执行警报(…)
的话,听起来您很关心XSS注入,但是要存储该警报,查询首先需要有效。这是XSS漏洞,而不是SQL注入。数据库与此无关。@Dormilich SQL注入可能是相关的,OP似乎没有使用$param
,因此它也是SQL注入的。嘿,Barmar,谢谢你的回答。这样,当我输出结果时,我得到了警报测试,我应该在将其发送到数据库之前转义该值吗?谢谢DNo,在显示在网页上之前,应使用htmlentities()
对其进行编码。数据库中的HTML和Javascript没有什么特别之处。总的来说,它在sql注入方面是安全的吗-(很抱歉打扰您)参数化查询可以防止SQL注入。htmlentities可以防止XSS。它们是完全独立的。@chris85取决于你在哪里回音,尽管总是使用它并没有坏处。在回显到HTML属性时需要它。
$DB::instance()->query("INSERT INTO table (column) VALUES (?)", ["<script>alert('test');</script>"]);
$this->_query->execute($params);
echo htmlentities($row['column'], ENT_QUOTES);