准备好的陈述 - 是的,我知道这是一个真正讨论过的话题

时间:2017-04-05 22:08:08

标签: php security prepared-statement sql-injection

我知道这是一个真正讨论过的话题,我不久前曾问过一个问题,这是一个无数次讨论过的话题。

但是,我仍然试图使用准备好的语句来保护网络应用程序。

真相是,从来没有真正得到它给出答案,查看重复的问题,查看其他问题和进行研究。

它可能不复杂......

所以,我有一个lcl_events.php文件,以:

开头
<?php include 'config/config.php'; ?>

<?php include'libraries/database.php'; ?>

database.php文件,如下所示:

<?php
 // Create connection
$mysqli= new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($mysqli->connect_errno) {
    die("Connection failed: " . mysqli_connect_error());
}

?>

页面加载很好,到目前为止一直很好(这里没有问题)。

然后,文件本身也包含:

<?php

$sql = "select * 
from companies where Company_Name LIKE (?) OR Company_Subcategory LIKE (?) OR Keywords LIKE (?) OR Description LIKE (?) AND Company_Category = (?) AND Featured = `Y` order by Date_Created DESC";

/* Prepared statement, stage 1: prepare */
$stmt = $mysqli->prepare($sql);
if(!$stmt) {
    die("Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error);
}

/* Prepared statement, stage 2: bind and execute */
$target = $_GET['target'];
$company = $_GET['company'];
$category = $_GET['category'];
$target = '%'.$target.'%'; //this means the data coming from this GET method can have words before and/or after

$bind_result = $stmt->bind_param("sssss", $target, $target, $target, $target, $category);

$execute_result = $stmt->execute();
if(!$execute_result) {
    echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}

$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {}

/* explicit close recommended */
$stmt->close();
$mysqli->close();

整个页面中重复重复6次

(还试图在问号周围没有圆括号的情况下编写查询。

结果如下:

enter image description here

无错误出现在日志中或使用:

  

使用error_reporting(E_ALL);

     

ini_set(&#39; display_errors&#39;,&#39; 1&#39;);

注意:我使用的是PHPStorm,并且没有出现任何错误。

厌倦了这个问题,它需要花费很长时间才能得到它...真的很感谢你的帮助,我只是想让它发挥作用。

1 个答案:

答案 0 :(得分:3)

将评论作为社区维基回答发布,因为它已在评论中解决。

Qirel

首先让我感到震惊的是查询失败,很可能是因为

Featured = `Y` 

是反叛的。 Y真的是一个专栏吗?如果它是一个字符串,则需要使用单引号'。此外,值得看看$ stmt-&gt;错误向您吐出的内容。旁注:(?)与?完全相同,你不需要括号。

由我自己:

顺便问一下,为什么这些括号(?)?当LIKE已经是核心MySQL方法时,你将LIKE视为直接函数。括号主要用于subqueries。 --- var_dump()您的查询,您将看到发生了什么(或不发生)。确保所有操作员都满足查询要求。如果一个失败了,那么整个都会。

它可能 无声地失败 ,因为滴答在查询中是有效的,给定&#34;如果&#34; Y是一个专栏,您尝试匹配等同于Featured列的内容,这是一个完全有效的查询,但不是针对这种情况。