【问题标题】:security deleting a mysql row with jQuery $.post使用 jQuery $.post 安全删除 mysql 行
【发布时间】:2011-02-01 08:00:07
【问题描述】:

我想在我的数据库中删除一行,并找到了一个example,关于如何使用 jQuery 的 $.post()
不过现在我想知道安全性..
有人可以从另一个网站向我的 delete-row.php 脚本发送 POST 请求吗?

JS

function deleterow(id) {
    // alert(typeof(id)); // number
    if (confirm('Are you sure want to delete?')) {
    $.post('delete-row.php', {album_id:+id, ajax:'true'},
        function() {
            $("#row_"+id).fadeOut("slow");
        });
    }
}

PHP:删除行.php

<?php
require_once("../db.php");
mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD) or die("could not connect to database " . mysql_error());
mysql_select_db(DB_NAME) or die("could not select database " . mysql_error());

if (isset($_POST['album_id'])) {    
    $query = "DELETE FROM albums WHERE album_id = " . $_POST['album_id'];
    $result = mysql_query($query);
    if (!$result) die('Invalid query: ' . mysql_error());
    echo "album deleted!";
}
?>

【问题讨论】:

  • 只是补充一点:不仅仅是一条记录,有人可能会在你眨眼之前删除你的整个数据库,通过 $_POST['album_id']。如果可能,考虑使用 mysqli 或 PDO(参数化查询)而不是糟糕的旧 mysql_*。
  • 非常感谢您添加有关 mysqli 和 PDO 的注释,我以前从未听说过它们,但会学习。所以你是说 mysqli 的示例代码更安全?还能证明吗?

标签: jquery mysql security post


【解决方案1】:

无论您是否通过 ajax 执行此操作,都可以有人向该页面发送带有正确信息的帖子并删除该行,是的。

编辑:

在大多数系统中,删除内容需要经过身份验证,如果是这种情况,那么我个人不会非常担心用户是否通过您的界面删除内容,而不是他们已经想出的其他方式。

使这变得更加困难的一个策略是拥有一个唯一的令牌,该令牌与页面一起加载,需要将其传递回服务器才能删除项目。因此,如果有人想从外部系统中删除行,他们将不得不调用页面并找到生成的令牌,也许您将其存储在隐藏字段、javascript 或会话中......但他们会有提取该令牌,然后将令牌和所需的任何信息(可能是 id)传递回删除页面...

您甚至可以想出一种策略来对要删除的项目的 ID 进行编码,这将使某人更难生成帖子以删除他们感兴趣的项目。因此,为了解决这个问题,您的没有编码的帖子将是 delete-row.php?id=123,使用编码 delete-row.php?id=j922dh28d7h2edkjdf78h,delete-row.php 然后需要解码“j922dh28d7h2edkjdf78h”以得出“123”并运行查询。

【讨论】:

  • 感谢您的解释,很高兴您提到我不应该非常担心:毕竟为什么我的客户会对删除相册感兴趣,即使他们不是他们的。反正他们不是超级用户。
【解决方案2】:

是的,向 delete-row.php 发送请求很简单,任何人都可以删除他们想要的任何内容。对您的 javascript 进行简单检查将使 URL 非常清晰,并且可以使用简单的循环脚本轻松删除整个专辑表。

您可能希望在无条件接受来自 $_POST 的任何内容并使用它修改您的数据库之前实施某种权限检查。

您的网站上是否有身份验证/登录系统?通常,在人们可以管理网站数据的网站上,您希望有某种方法来确保允许人们做他们想做的任何事情。

【讨论】:

  • 是的,我有一个 access_user 类来保护页面。我可以这样做: $page_protect = new Access_user; $page_protect->access_page(); access_page 方法是这样的: function access_page($refer = "", $qs = "", $level = DEFAULT_ACCESS_LEVEL) { $refer_qs = $refer; $refer_qs .= ($qs != "") ? "?".$qs : ""; if (!$this->check_user()) { $_SESSION['referer'] = $refer_qs; header("位置:".$this->login_page);出口; } if ($this->get_access_level() deny_access_page);出口; } }
  • 你认为用类来保护我的 delete-album.php 脚本就足够了吗?
【解决方案3】:

你的代码的问题是这一行:

$query = "DELETE FROM albums WHERE album_id = " . $_POST['album_id'];

这意味着任何人都可以删除任何数据库字段。你想要的是这样的:

$query = "DELETE FROM albums WHERE album_id = {$_POST['album_id']} AND owner_id = {$_SESSION['owner_id']}";

其中$_SESSION['owner_id'] 在登录身份验证过程之后设置。因此攻击者只能删除自己的记录,不能删除其他人的记录。

【讨论】:

    猜你喜欢
    • 2017-11-30
    • 2013-03-15
    • 2014-03-17
    • 2016-07-14
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多