Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用jQuery$.post删除mysql行的安全性_Jquery_Mysql_Security_Post - Fatal编程技术网

使用jQuery$.post删除mysql行的安全性

使用jQuery$.post删除mysql行的安全性,jquery,mysql,security,post,Jquery,Mysql,Security,Post,我想删除数据库中的一行,并找到了一个关于如何使用jQuery的$.post()执行此操作的示例 但现在我想知道安全性。 有人可以从其他网站向我的delete-row.php脚本发送POST请求吗 JS PHP:delete-row.PHP <?php require_once("../db.php"); mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD) or die("could not connect to database " . mysql

我想删除数据库中的一行,并找到了一个关于如何使用jQuery的$.post()执行此操作的示例
但现在我想知道安全性。
有人可以从其他网站向我的delete-row.php脚本发送POST请求吗

JS

PHP:delete-row.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!";
}
?>

无论您是否通过ajax进行操作,都可能有人向该页面发送包含正确信息的帖子并删除该行,是的

编辑:

在大多数系统中,删除东西都需要经过身份验证,如果是这种情况,那么我个人就不太关心用户是否通过您的界面删除东西,而不是他们想出的其他方式

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


你甚至可以想出一个策略来编码被删除项目的ID,这会让人很难生成帖子来删除他们感兴趣的项目。因此,为了澄清这一点,您未编码的帖子将是delete row.php?id=123,编码为delete row.php?id=j922dh28d7h2edkjdf78h,delete-row.php然后需要解码“j922dh28d7h2edkjdf78h”以得到“123”并运行查询。

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

编辑:

在大多数系统中,删除东西都需要经过身份验证,如果是这种情况,那么我个人就不太关心用户是否通过您的界面删除东西,而不是他们想出的其他方式

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


你甚至可以想出一个策略来编码被删除项目的ID,这会让人很难生成帖子来删除他们感兴趣的项目。因此,为了澄清这一点,您未编码的帖子将是delete row.php?id=123,编码为delete row.php?id=j922dh28d7h2edkjdf78h,delete-row.php然后需要解码“j922dh28d7h2edkjdf78h”以得到“123”并运行查询。

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

您可能希望在不接受来自$\u POST的任何内容并使用它修改数据库之前实现某种权限检查


你的网站上有认证/登录系统吗?一般来说,在人们可以管理网站数据的网站上,你需要某种方法来确保人们可以做他们想做的任何事情。

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

您可能希望在不接受来自$\u POST的任何内容并使用它修改数据库之前实现某种权限检查


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

代码的问题是这一行:

$query = "DELETE FROM albums WHERE album_id = " . $_POST['album_id'];
这意味着任何人都可以删除任何DB字段。你想要的是这样的:

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

其中,
$\u会话['owner\u id']
在登录身份验证过程后设置。因此,攻击者只能删除他们自己的记录,而不能删除其他人的记录。

您的代码存在以下问题:

$query = "DELETE FROM albums WHERE album_id = " . $_POST['album_id'];
这意味着任何人都可以删除任何DB字段。你想要的是这样的:

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

其中,
$\u会话['owner\u id']
在登录身份验证过程后设置。因此,攻击者只能删除他们自己的记录,而不能删除其他人的记录。

只需添加:除了一条记录之外,有人还可以通过$\u POST['album\u id']在你眨眼之前删除你的整个数据库。考虑使用MyQuLi或PDO(参数化查询)而不是可怕的旧MySqL**。非常感谢您添加了关于MySqLi和PDO的注释,我以前从未听说过,但是会学习。那么你是说mysqli的示例代码更安全?还有证据吗?只需补充一点:除了一张唱片,还有人可以在你眨眼之前通过$_POST['album_id')删除你的整个数据库。考虑使用MyQuLi或PDO(参数化查询)而不是可怕的旧MySqL**。非常感谢您添加了关于MySqLi和PDO的注释,我以前从未听说过,但是会学习。那么你是说mysqli的示例代码更安全?还有证据?是的,我有一个access\u用户类来保护页面。我可以做:$p