Php PDO准备-绑定值

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;

我有一个PDO DB类,它是由一个教程制作的。 其中有一个方法在我发送insert查询时绑定值,实际上是这样的:

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);