在 php 的 Mysqli 查询中指定 ID

Specifying ID in Mysqli query in php

我在 CMS 站点上工作,我有存储在数据库中的博客 post。我可以创建、编辑和删除它们。但是当我想编辑它们时出现问题。 我无法在更新查询中指定 WHERE 子句来匹配博客的 ID post 我正在尝试编辑!

假设我有一个博客 post,其 ID 为“5”。 如果我为它编写这段代码,它会完全按照它应该的方式工作。

 $sqledit = "UPDATE paginas SET message='$_POST[message]' WHERE id= $_POST[id]";

但我不想只编辑博客 post #5,我想编辑我正在更新的博客 post。在我看来这应该有效,

WHERE id= $_POST[id]";

...但事实并非如此。

这只会给我一个未定义的 ID 错误。但这不应该,因为我可以使用此特定代码以完全相同的方式删除博客 posts:

$sqldel = "DELETE FROM `paginas` WHERE id= $_POST[id]"; 

这确实允许我这样做。

下面的代码在博客页面,编辑查询在它自己的edit.php页面

        if (isset($_POST['edit'])) // if pressed, execute

        {  
        echo

        '<br><br>  <div class="blogscript">
         <form action="edit.php" method="post">Edit your stuff<br>          
        <input type="text" placeholder='. $pagetitle . ' ><br><br>          
        <textarea id="message2" name="message">&lt;p&gt;' . $message . '&lt;/p&gt;</textarea><br>           
        <input type="submit" name="editsubmit" value="Confirm" />
        <input type="hidden" name="id" value="' . $id . '">.            </form></div>';
        }           

我期待着我应该尝试的任何提示。

编辑:

这是我的edit.php页面

<?php
  $DB_host = "localhost";
  $DB_user = "root";
  $DB_pass = "";
  $DB_name = "cmsbase";

  $MySQLi_CON = new MySQLi($DB_host,$DB_user,$DB_pass,$DB_name);

     if($MySQLi_CON->connect_errno)
     {
         die("ERROR : -> ".$MySQLi_CON->connect_error);
     }


     $sql = "UPDATE paginas SET message='$_POST[message]' WHERE id= $_POST[id]";

    if ($MySQLi_CON->query($sql) === TRUE) {
    echo "";
    } else {
    echo "Error: " . $sql . "<br>" . $MySQLi_CON->error;
    }
    $MySQLi_CON->close(); //close connection


    echo "<script>alert('Edited');location.href='index.php';</script>";

?>

编辑:这是 var_dump 包含的内容

为了在 $_POST 中显示值,您需要在表单中包含一些元素(例如 <input><select><textarea>name 属性设置为您想要的 $_POST 键。

您可以在表单中添加一个隐藏的 ID 输入。

<input type='hidden' name='id' value='" . $id . "'>

假设您通过从数据库中进行选择来获取该表单代码中显示的 $message 变量,您也应该能够从那里获取 ID,或者可能从您的 $_GET 如果这就是您确定显示哪个 post 的方式。

(While this is not actually an answer, what I want to say does not fit in the comments)

你的线路

$sql = "UPDATE paginas SET message='$_POST[message]' WHERE id= $_POST[id]";

太可怕了。这是噩梦。假设表单中的 POSTed 数据是从某处某个机器人的脚本中 posted 的,因为我很确定您的代码中没有 prevent XSRF

如果该脚本选择 post:

会怎样
$_POST ==> array => message = "mwahahaha";
                 => id      = "1; DROP TABLE paginas;"

你可能会想 "how would they know my table name?" ,但很容易从其他入口点的其他恶意 ID 插入或其他黑客攻击中找到 SELECT 结果,并且许多表具有通用名称例如“用户”/“订单”/“购物篮”/“” touch-me" 等等(好吧,也许不是touch-me,但你明白了)。

Mysqli_real_escape_string() 可以使用,但这只是转义引号和特殊字符,它不会减轻 SQL 注入和危害。

那么,你该怎么办呢?

在这种情况下,我想提请您注意 PHP type juggling。与许多其他语言不同,PHP 具有隐含的数据类型而不是特定的数据类型,因此 "1.06" 的数据类型可以 string 混合使用也是float

你的 MySQL 中的 id 参数很可能是一个数字整数值,所以你怎么能确定 $_POST['id'] 的值也是整数而不是 SQL Instruction?

$id = (int)$_POST['id'];

强制值是一个整数,所以

$id = (int)"1; DROP TABLE paginas;";

实际处理为$id = 1。因此,可以在您的网站、数据库和声誉中为您节省大量受损表、垃圾邮件行和其他恶意垃圾。

请记住以下概念:

永远不要相信任何用户提交的代码。

永远