我正在尝试确定使用php和MySQL在CRUD中删除的最安全的方法或最佳实践。我被教导的方式是创建<a href="delete.php=?{$id}">Delete</a>
链接并删除.php在$_GET
变量中传递的 id 上运行我的 delete()
方法。
-
如果我允许网络爬虫查看此页面,如果它抓取每个页面上的每个删除链接,它不能删除整个数据库吗?
-
不知何故找出调用
delete()
的页面的人不能手动加载带有他们想要的 url$_GET
中的任何数字并删除记录吗? -
是否最好永远不要通过 CRUD 删除任何内容,而是将"已删除"列添加到表中,并使其看起来好像已被用户删除?
-
我只是偏执狂吗?
如果我允许网络爬虫查看此页面,如果它抓取每个页面上的每个删除链接,它不能删除整个数据库吗?
是的。
不知何故找出调用 delete(( 的页面的人不能在 $_GET 中手动加载他们想要的任何数字并删除记录的 url 吗?
是的。
是否最好永远不要通过 CRUD 删除任何内容,而是将"已删除"列添加到表中,并使其看起来好像已被用户删除?
如果你真的想删除它,imo,删除更好。
我只是偏执狂吗?
一点也不。
如果你只有一个删除.php脚本,它有如下内容(忽略CRUD atm并谈论MySQL(:
$q = "DELETE FROM mytable WHERE row = $_GET['id']";
$r = mysql_query($q);
那么是的,你的前两个担忧实际上是会发生什么。 偶然发现这些链接的蜘蛛会导致数据库记录被删除,发现链接的恶意用户同样可以从数据库中删除行。
这通常有两种处理方式:
不要将删除.php链接提供给不应该拥有它的人(未登录的人,未以管理员身份登录的人等( - 但请注意,这只是一个好处,并不能保护您的数据库免受意外/恶意删除。
在 delete.php 脚本中,验证是否允许运行它的人员删除行。 大多数情况下是通过检查登录时设置的会话变量来完成的(例如
if($_SESSION['can_delete'] != true){ die('Insufficient Privileges'); }
(。
尽管不向不应该拥有它的人提供删除.php链接很有帮助,但如果您希望它安全,则需要在 delete.php 脚本中显式检查权限。
阅读《末日蜘蛛》。
您可以使用链接删除内容,但链接绝不应公开暴露在可以抓取的位置,甚至不应被内部索引蜘蛛抓取。 相反,您必须检查每个删除操作的用户授权,以确保进行删除的用户拥有或以其他方式有权修改它。
因此,您的delete()
方法必须做的不仅仅是删除(或调用delete()
的控制器脚本(。在执行任何修改或删除之前,请始终检查用户授权。
是实际执行删除还是仅将行标记为已删除,取决于是否需要应用程序能够取消删除它们。无论哪种方式,在采取行动之前检查授权。
-
是的。这种情况发生在相当多的人身上,谷歌抓取一个"删除"页面并删除其内容。我记得有一篇非常好的博客文章,但似乎找不到它。
-
是的,这是完全可能的,而且很容易做到。这就是您需要构建授权系统的原因。这意味着在执行任何操作之前,系统应在执行操作之前检查是否允许用户执行其请求的操作。
-
同样,这取决于。如果数据不再有用,那么一定要删除它并摆脱它。但是,如果您想支持某种"取消删除",则只需将该项目标记为已删除即可。
-
没有:)
一种简单的方法是启动一个会话,如下所示:
$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']);
}
尝试使用 POST 方法并隐藏 ID,应该是这样的
<form action="" method="POST">
<input type="hidden" name="id" value="<?= $id; ?>"/>
<button type="submit">Delete</button>
</form>