1

我正在尝试确定使用 php 和 MySQL 在 CRUD 中删除的最安全方法或最佳实践。我被教导的方式是创建<a href="delete.php=?{$id}">Delete</a>链接并让 delete.php在变量delete()中传递的 id 上运行我的方法。$_GET

  1. 如果我允许网络爬虫查看此页面,如果它爬取每个页面上的每个删除链接,它不能删除整个数据库吗?

  2. 无法以某种方式找出调用页面的人无法delete()使用他们想要的任何数字手动加载 url$_GET并删除记录?

  3. 永远不要通过 CRUD 删除任何内容,而是将 Deleted 列添加到表中并使其看起来好像已被用户删除,这样会更好吗?

  4. 我只是偏执狂吗?

4

5 回答 5

2

如果我允许网络爬虫查看此页面,如果它爬取每个页面上的每个删除链接,它不能删除整个数据库吗?

是的。

无法以某种方式找出调用 delete() 的页面的人无法在 $_GET 中使用他们想要的任何数字手动加载 url 并删除记录?

是的。

永远不要通过 CRUD 删除任何内容,而是将 Deleted 列添加到表中并使其看起来好像已被用户删除,这样会更好吗?

如果你真的想删除它,imo,删除更好。

我只是偏执狂吗?

一点也不。


如果您只有一个 delete.php 脚本,它具有以下内容(忽略 CRUD atm 并谈论 MySQL):

$q = "DELETE FROM mytable WHERE row = $_GET['id']";
$r = mysql_query($q);

那么是的,您的前两个担忧实际上是会发生什么。偶然发现这些链接的蜘蛛会导致数据库记录被删除,而发现这些链接的恶意用户同样可以从数据库中删除行。

这通常有两种处理方式:

  1. 不要将 delete.php 链接提供给不应该拥有它的人(未登录的人、未以管理员身份登录的人等)——但请注意,这只是一个细节,并没有保护您的数据库免受意外/恶意删除。

  2. 在 delete.php 脚本中,验证运行它的人是否被允许删除行。大部分时间是通过检查登录时设置的会话变量来完成的(例如if($_SESSION['can_delete'] != true){ die('Insufficient Privileges'); })。

尽管不将 delete.php 链接提供给不应该拥有它的人会很有帮助,但如果您希望它是安全的,则需要明确检查 delete.php 脚本中的权限。

于 2012-05-05T02:30:59.263 回答
1

阅读末日蜘蛛

您可以使用链接来删除内容,该链接不应公开暴露在可能被抓取的地方,甚至不应该被内部索引蜘蛛抓取。相反,您必须检查每个删除操作的用户授权,以确保进行删除的用户拥有或有权修改它。

因此,您的delete()方法必须做的不仅仅是删除(或调用的控制器脚本delete())。在执行任何修改或删除之前,请始终检查用户授权。

您是否实际执行删除或只是将行标记为已删除取决于您是否需要您的应用程序能够取消删除它们。无论哪种方式,在采取行动之前都要检查授权。

于 2012-05-05T02:31:57.203 回答
1
  1. 是的。这发生在相当多的人身上,谷歌抓取了一个“删除”页面并删除了他们的内容。我记得有一篇关于它的非常好的博客文章,但似乎找不到。

  2. 是的,这是完全可能的,而且很容易做到。这就是为什么你需要建立一个授权系统。这意味着在执行任何操作之前,系统应该在执行操作之前检查是否允许用户执行他所请求的操作。

  3. 同样,这取决于。如果数据不再有用,那么一定要删除它并摆脱它。但是,如果您想支持某种“取消删除”,则只需将该项目标记为已删除。

  4. 不 :)

于 2012-05-05T02:33:08.930 回答
1

一种简单的方法是启动一个会话,如:

$somevar = 'abc123'
$_SESSION['secureDelete'][$id] = $somevar;

然后打印:

<a href="delete.php?id={$id}&action={$somevar}">Delete</a>

当您要删除文件时,请检查该会话是否存在该 $somevar 值:

if (isset($_SESSION['secureDelete'][$id]) && $_SESSION['secureDelete'][$id] == $_GET['action']) {
  deleteFunction($_GET['id']);
}
于 2012-05-05T02:39:59.627 回答
0

尝试使用POST方法并隐藏ID,应该是这样的

<form action="" method="POST">
<input type="hidden" name="id" value="<?= $id; ?>"/> 
<button type="submit">Delete</button> 
</form>
于 2014-05-06T09:04:06.433 回答