Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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 如何正确使用mysqli查询和防止注入_Php_Mysql_Mysqli - Fatal编程技术网

Php 如何正确使用mysqli查询和防止注入

Php 如何正确使用mysqli查询和防止注入,php,mysql,mysqli,Php,Mysql,Mysqli,所以我试图学习mysqli并进行一些数据库查询。我正在使用在这里找到的类文件 我想确保我这样做是正确的,以防止任何mysql注入尝试,但我有一点麻烦 下面是我对一个查询的尝试: $id = '1776425144629'; $query = "SELECT * FROM article WHERE type = 'lnews' AND article_id = " . $id; $query = $database->escape($query); $results = $database

所以我试图学习mysqli并进行一些数据库查询。我正在使用在这里找到的类文件

我想确保我这样做是正确的,以防止任何mysql注入尝试,但我有一点麻烦

下面是我对一个查询的尝试:

$id = '1776425144629';
$query = "SELECT * FROM article WHERE type = 'lnews' AND article_id = " . $id;
$query = $database->escape($query);
$results = $database->get_results( $query );
foreach( $results as $row )
{
    echo $row['headline'] .'<br />';
}
它在我身上出错并显示以下内容:

 Query: SELECT * FROM article WHERE type = \'lnews\' AND article_id = 1776425144629
 Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\'lnews\' AND article_id = 1776425144629' at line 1

因此,我的问题是,如何向sql语句传递一些参数,同时仍然使用escape或filter函数来阻止任何mysqli注入?

好的,这里有几个问题:

 $query = "SELECT * FROM article WHERE type = 'lnews' AND article_id = " . $id;
这一行是SQL注入的核心:在真正简化的版本中防止SQL注入可以描述为:不再连接变量。 所以没有了

 $sometext . $someid;
或 “$sometext$someid”

不允许,很简单

那又怎样?您必须开始使用绑定变量。您的查询将如下所示:

$query = "SELECT * FROM article WHERE type = 'lnews' AND article_id = ?";
$stmt=$mysqli->prepare($query);
$stmt->bind_param($id);
有关更多详细信息,请参见(*只需跳到底部的示例)

第二期(我承诺了几期):


这将跳过完整查询。永远不要在查询上使用,只能在变量上使用(如果需要转义:使用变量绑定时:不需要:它是隐式的)。

发生这种情况的原因是因为您正在转义实际的查询语句。PHP正在逃避引用,因此出现了“\'lnews\”。这将停止查询,因为您正在执行以下语句:

"SELECT * FROM article WHERE type = \'lnews\' AND article_id = 1776425144629"
您要做的是转义传递的值。请改用以下方法:

$id = '1776425144629';
$id = $database->escape($id);
$query = "SELECT * FROM article WHERE type = 'lnews' AND `article_id` = '".$id."'";
$query = $database->$query;
$results = $database->get_results( $query );
foreach( $results as $row )
{
    echo $row['headline'] .'<br />';
}
$id='1776425144629';
$id=$database->escape($id);
$query=“从文章中选择*,其中类型='lnews'和'article_id`='”。$id.“;
$query=$database->$query;
$results=$database->get_results($query);
foreach($结果为$行)
{
echo$row['headline']。
; }

这应该行得通。

啊,我对逃跑过程的误解。现在有道理了。问题tho,bind_参数是否需要有排序标识符(“s|i”,$id)?那么多个要绑定的参数呢?例如,如果lnews是bnews?只需执行type=?和文章_id=?然后绑定参数($type,$id)?mysqli可以只处理绑定变量的顺序。是的,你的类型=?和文章_id=?这样做是正确的。参见准备好的陈述
"SELECT * FROM article WHERE type = \'lnews\' AND article_id = 1776425144629"
$id = '1776425144629';
$id = $database->escape($id);
$query = "SELECT * FROM article WHERE type = 'lnews' AND `article_id` = '".$id."'";
$query = $database->$query;
$results = $database->get_results( $query );
foreach( $results as $row )
{
    echo $row['headline'] .'<br />';
}