【问题标题】:ajax & PDO variable as condition for WHEREajax 和 PDO 变量作为 WHERE 的条件
【发布时间】:2017-04-25 11:08:31
【问题描述】:

所以我想为我的数据库制作一个小“搜索引擎”。 我的 javascript 是:

 $(document).ready(function () {
     $("#display").click(function () {
         var zoeknaam = $("#zoeknaam").val();
         var zoektype = $("#zoektype").text();
         $.ajax({    //create an ajax request to load_page.php
             type: "POST",
             url: "display.php",
             data: { name: zoeknaam, zoekt: "name" },
             dataType: "html",   //expect html to be returned                
             success: function (response) {
                 $("#responsecontainer").html(response);
                 //alert(response);
             }

         });
     });
 });

我的 html 如下:

<input type="text" name="inputtext" id="zoeknaam" />
<select name="searchtype" id="zoektype"><option value="name">name</option><option value="age">age</option></select>
<input type="button" id="display" value="Display All Data" />

现在我有了我的 php

include("connection.php");
$dataget = $_POST["name"];
$datawaar = $_POST["zoekt"];
$stmt = $conn->prepare("SELECT * FROM student WHERE :waar=:postname");
$stmt->bindParam(':waar', $datawaar, PDO::PARAM_STR);
$stmt->bindParam(':postname', $dataget, PDO::PARAM_STR);
$stmt->execute();
echo "<table>";
while($data = $stmt->fetch(PDO::FETCH_ASSOC))
{   
    echo "<tr>";
    echo "<td align=center>$data[name]</td>";
    echo "<td align=center>$data[address]</td>";
    echo "<td align=center>$data[age]</td>";
    echo "</tr>";
}
echo "</table>";

当我删除 where 条件并设置条件以命名它时。现在,当我用帖子和参数检索它时,它不起作用。 connection.php 是正确的,因为它适用于条件。

【问题讨论】:

    标签: javascript php mysql ajax pdo


    【解决方案1】:

    这是错误的:

    ... WHERE :waar=:postname
    

    您只能在准备好的语句中使用占位符绑定值,而不是列名或表名。

    如果您想接受并使用客户端提供的列名或表名,唯一的保护方法是对照白名单检查它们,然后将它们直接注入到查询字符串中。

    【讨论】:

    • 我确实知道如何保护它以防止 sql 注入,但为什么该语句不能使用 :waar 作为 where 条件和 :postname 作为值,因为如果 waar = name 和 postname test 语句将具有 WHERE name="test" 应该可以工作
    • @emielpopelier 这是设计使然。据我所知,这主要是因为在准备时表名和/或列名未知时,sql引擎无法准备任何东西:它不知道要使用哪些索引,如何优化查询等. 等等 所以真的没有什么要准备的。 Sql 注入安全只是一个很好的副作用。
    • 我尝试将准备更改为查询,但这也没有给出任何结果。还有其他东西代替 ->prepare 吗?
    • @emielpopelier 我不确定你做了什么改变,但最重要的是你只能为 values 使用占位符,而不是列名或表名(或运算符等)。
    • 好吧,我想我不需要那些准备好的,但那我需要什么?我需要 $conn->query("SELECT * FROM studend WHERE :waar=:postname") 吗?因为这也不起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 2021-11-02
    • 1970-01-01
    • 2017-04-02
    • 2016-01-24
    • 2016-11-28
    • 1970-01-01
    相关资源
    最近更新 更多