在 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"><p>' . $message . '</p></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]";
太可怕了。这是噩梦。假设表单中的 POST
ed 数据是从某处某个机器人的脚本中 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
。因此,可以在您的网站、数据库和声誉中为您节省大量受损表、垃圾邮件行和其他恶意垃圾。
请记住以下概念:
永远不要相信任何用户提交的代码。
永远
我在 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"><p>' . $message . '</p></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]";
太可怕了。这是噩梦。假设表单中的 POST
ed 数据是从某处某个机器人的脚本中 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
。因此,可以在您的网站、数据库和声誉中为您节省大量受损表、垃圾邮件行和其他恶意垃圾。
请记住以下概念:
永远不要相信任何用户提交的代码。
永远