什么是从mysql中安全删除数据的最佳方法?(PHP / Mysql)

3
我希望能够允许用户和我(管理员)删除mysql中的数据。我曾经有一个remove.php文件,可以从需要删除的任何地方获取$_GET,例如...remove.php?action=post&posting_id=2。但是我发现任何人都可以滥用它并删除所有我的数据。
那么有没有最安全的方法让用户和我在不变得疯狂和困难的情况下删除信息?我只是一个初学者 :) 我不确定是否可以使用POST,因为没有表单,并且数据没有改变。会话好吗?或者会有太多文章、用户信息、评论等等。
例如:詹姆斯想删除他的一篇文章(post_id=5)。所以他点击了删除链接,然后跳转到remove.php?action=post&posting_id=5。
编辑:好吧,现在我有点困惑。虽然我不能100%保证安全,但如何使用$_POST呢? 所以我应该使用GET将所有数据传递到remove.php,然后有一个确认提交按钮,当用户点击它时,它将所有数据放入POST中并从dbc中删除吗?

GET在标准中保证是幂等的,而您的使用情况明显违反了这一点(如果您标记为已删除而不是实际删除,则可以避免此问题,尽管通常应避免从GET触发副作用)。如果您愿意,可以自由选择这样做,但如果您想按规则玩耍,您需要使用POST。 - Nick Bastin
3个回答

6

删除记录是一种令人担忧的做法。如果您或其他人犯了错误,就没有真正的解决办法。删除的记录很难恢复。

与其删除记录,不如添加一个“活动”位(例如布尔)列,当用户“删除”记录时切换关闭。实质上,您的用户将通过切换关闭来暂停记录,并保存记录以防止错误或滥用,但对用户而言似乎已被“删除”。要使其与其他查询配合使用,只需添加一个where子句,其中active = 1。

然后,您可以运行某个特定日期间隔的实用程序脚本,清除过时的记录。这种维护需要某种类型的时间戳。

这只是一个想法。接受它所值得的。


不错的想法!我认为我会在重要的事情上这样做,比如删除用户之类的。谢谢。 - ggfan

2

我会跟随gurun8的建议,更喜欢将记录标记为已删除,而不是实际删除数据。当然,您需要检查经过身份验证的用户是否有权限删除帖子。

但是,非常重要的一点是要提到$_GET即使在进行身份验证时也不安全,因为存在跨站请求伪造的风险。

想象一下,如果亚马逊根据GET请求向您的购物车中添加商品,那么我只需在我的页面上放置一个该URL的图像,每个访问该页面并登录亚马逊的人都将自动添加产品。

为了配合您的例子,如果我不喜欢詹姆斯的帖子,我会在我的网站上放置这样的图片:

<img src='http://example.com/remove.php?action=post&posting_id=5'>

我给他发送了一个链接,让他查看我的页面,并希望此时他已经登录到您的网站。因为,当然,他点击了那个小的“保持登录”按钮。

所以你对使用GET感到担忧是正确的。如果您不想在页面上放置表单,请通过POST确认操作。


但是我该如何在POSTS中使用它呢?因为数据并没有在表单中被更改。用户只需点击删除链接即可。 - ggfan
如果“删除”只是一个链接,那么让该链接指向一个页面,在该页面上,他们必须提交(通过POST)确认他们确实想要删除某些内容。这是一个好的步骤。或者使用漂亮的图像代替文本链接(图像可以是提交按钮,提交隐藏字段)。或者使用某种JavaScript在单击链接时POST数据。 - Tim Lytle
@Tim。但是说remove.php?posting_id=5会带他们到一个确认页面,然后他们需要点击提交按钮。但这与没有提交按钮有什么不同呢?因为如果有人想要黑客攻击,他们不是也可以只要点击提交按钮吗?我有点困惑 x] - ggfan
@ ggfan,CSRF(跨站请求伪造)发生在第三方网站“欺骗”浏览器发出GET请求时。但是,如果该请求是发送到需要进行POST的确认页面,则无法欺骗浏览器代表用户点击提交。 - Tim Lytle
@Tim:该死。我以前听说过这些图像技巧,但我认为“检查是否已登录”的功能可以解决这个问题...我猜不行。我想引用者检查也不可靠...但你仍然可以在URL中使用某种会话密钥,对吧? - mpen
@Mark 是的,一个会话密钥会帮助混淆链接;但我猜即使这样也可能会存在漏洞(现在已经太晚了无法回忆)。我只会坚持使用POST。 - Tim Lytle

0

首先,您需要使用登录脚本对用户进行身份验证。

如果您想要最简单的解决方案,那么我建议您使用一个简单的 .htaccess 文件来保护您的 remove.php 目录,并设置 用户名和密码

如果不同的用户有不同的权限来删除数据库条目,那么您可能需要创建一个 PHP 登录脚本并使用 PHP 会话。

如果我很蠢,请原谅我,但我搜索了相当长的时间,寻找一个可以放置在真实网站上的简单的 PHP 登录教程(不使用 session_register(),而是使用 mysql_real_escape_string()、htmlspecialchars() 等),但我根本找不到一个!

也许 这个 是最接近的一个,您只需要将 session_register() 变量替换为 $_SESSION 变量即可使其在没有 register_globals(PHP5 的默认设置)的情况下工作。


你打算如何在没有会话的情况下跟踪用户?我想你可以通过 cookie 传递所有数据,或者通过每个链接传递用户 ID 和令牌...然后访问数据库来验证令牌...但是实现一个安全的身份验证系统而不使用这些方法将非常困难。人们使用它们是有原因的!它们使得实现变得更加容易和简单,而不是相反! - mpen
我指的是使用$_SESSION变量来存储会话数据,而不是session_register(),因为在PHP5中,register_globals = off将禁用它。 - Indrek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接