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