我正在CMS网站上工作,我有一些博客文章存储在数据库中。我可以创建,编辑和删除它们。但是当我想编辑它们时会出现问题。 我无法在更新查询中指定WHERE子句以匹配我正在尝试编辑的博客文章的ID!
假设我有一个id为'5'的博文。 如果我为它编写这段代码,它的工作方式就完全正确。
$sqledit = "UPDATE paginas SET message='$_POST[message]' WHERE id= $_POST[id]";
但我不想只编辑博客文章#5,我想编辑我正在更新的博文。在我看来这应该有用,
WHERE id= $_POST[id]";
......但事实并非如此。
这只会引发一个未定义的id错误。但它不应该因为我可以用这个特定代码完全相同的方式删除博客文章:
$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>";
?>
答案 0 :(得分:2)
为了使$_POST
中的值存在,您需要在表单中包含一些元素(例如<input>
,<select>
,<textarea>
)name
1}}属性设置为您想要的$_POST
密钥。
您可以在表单中为ID添加隐藏的输入。
<input type='hidden' name='id' value='" . $id . "'>
假设您从数据库中选择了该表单代码中显示的$message
变量,您应该也可以从那里获取ID,或者可能从$_GET
获取该ID,如果是如何确定正在显示的帖子。
答案 1 :(得分:1)
(虽然这实际上不是一个答案,我想说的不适合评论)
你的行
$sql = "UPDATE paginas SET message='$_POST[message]' WHERE id= $_POST[id]";
太可怕了。这是噩梦。让我们说一个表单中的POST
ed数据是从某个机器人的脚本中发布的,因为我很确定你的代码中没有prevent XSRF。
如果该脚本选择发布该怎么办:
$_POST ==> array => message = "mwahahaha";
=> id = "1; DROP TABLE paginas;"
你可能会想“他们怎么知道我的桌子名字?” ,但很容易从其他恶意的id插入或其他入口点上的其他hack中找到SELECT结果,而且许多表都有常见的名称,例如“ users ”/“ order “/” baskets “/” 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
处理的。因此,您可以在整个网站,数据库和声誉中节省大量受损桌面,垃圾邮件行和其他恶意垃圾。
请在船上采取以下概念:
从不信任任何用户提交的代码。
<强> EVER 强>