0

我在 mysql 中有一条表消息

id(bigint)      sender(int)    receiver(int)     message(varchar)
1                 42                420           Hi
2                 80                32            Hello
3                 61                32            I love you

我的 delete.php 代码

if(isset($_POST['id']))mysql_query("Delete from message where id=".$_POST['id']."");

用户使用 ajax 请求删除消息的页面

<div>sender:Romeo
receiver:Juliet
message:I love you</div>
<span id="3">delete</span>//delete message with id 3
<script>
$("span").click(function(){$.post("delete.php",{"id",$("span").attr("id")});
});</script>

现在据我所知,任何人都可以知道我正在向哪个页面发出此请求,并使用方法 post 和 action delete.php 轻松开发一个假表单并删除消息。谁能告诉我如何防止这种情况?

4

8 回答 8

5

您需要验证/验证传入数据(即当前用户是否有权删除指定消息?)。您还需要通过使用准备好的语句来防止 SQL 注入,而不是直接将用户数据插入到查询中。

于 2012-06-08T11:10:16.013 回答
1

mysql_real_escape_string()应该用于清理 MySQL 查询的用户输入。

例如。

$id = mysql_real_escape_string( $_POST['id'] );
mysql_query( "SELECT * FROM blah WHERE id='$id'" );
于 2012-06-08T11:12:51.060 回答
1

请注意,如果您过滤和转义数据,则不会阻止用户了解 Ajax 调用的端点并通过猜测 ID 来删除所有消息。

就像 Ed Daniel 指出的那样,您应该使用身份验证,以便只有授权用户才能删除帖子,并且只有他们是作者或有权这样做。

于 2012-06-08T11:17:05.027 回答
0

这是一个修复:

$id = array_key_exists('id', $_POST) ? (int) $_POST['id'] : null;
if ($id)
{
    mysql_query("DELETE FROM message WHERE id={$id}");
}

我首先检查了该项目是否存在于$_POST数组中,以避免 PHP 通知,而且我(int)在使用它之前已经对其进行了消毒。

一些建议:总是在你的if陈述中使用大括号——有一天它会为你省去很多麻烦。另外,如果可以的话,迁移到 PDO 或 mysqli,这样你就可以使用准备好的语句。最后,最好有一个 SQL 的大小写约定——如果你愿意,你可以用标题大小写来写它,但我更喜欢大写的关键字,小写的实体名称。

于 2012-06-08T11:10:52.300 回答
0

我希望朱丽叶必须首先登录才能看到该消息!基本上,这就是您的答案 - 用户身份验证。如果 POST 的提交者无法说服您他们有权删除该邮件,那么不要让他们这样做。

正如 Olli Charlesworth 指出的那样,SQL 是在自找麻烦。

于 2012-06-08T11:14:50.223 回答
0

该页面必须仅供登录用户访问。您可以通过检查他的 user_id 或 $_SESSION 中的任何类似内容来简单地检查天气用户是否已登录。即使有人可以将数据从他的 m/c 发布到您的服务器,它也不会被添加,因为您已经在上面进行了身份验证检查。你最好使用 prepare 语句、mysql_escape 或 addSlashes、regexp 等来清理你的输入。

于 2012-06-08T11:16:08.380 回答
0

您示例中的代码包含一个大的 MySQL 注入问题。无论您是否使用由用户控制的 $_POST、$_GET、$_COOKIE、$_FILES、$_SERVER 中的值(包括 USER_AGENT、上传文件的文件名等),您都必须对其进行保护。

正如建议的那样,最好的方法是使用 PDO(PHP 数据对象,用于数据库访问的抽象层)。 mysql_real_escape_string()转义像 " 和 ' 之类的任何引号,但对每种类型的注入都没有帮助。

在你的情况下,如果有人使用-1 OR 1=1你的整张桌子将被清除。并且mysql_real_escape_string不能提供任何安全保障。

您还应该实现某种登录,现在每个人都可以删除表中的任何记录。

查看 PDO 的 PHP 手册:http: //de.php.net/manual/en/pdo.prepare.php了解更多信息。

于 2012-06-08T11:27:51.940 回答
0

检查记录的用户 ID 是否等于接收者 ID。

如果没有,就死

于 2012-06-08T14:28:05.480 回答