我正在编写一个小型 Web 应用程序,用于写入数据库(Perl CGI 和 MySQL)。 CGI 脚本从表单中获取一些信息并将其写入数据库。然而,我注意到,如果我在网络浏览器上点击“重新加载”或“返回”,它会再次将数据写入数据库。我不想要这个。
在这种情况下,防止数据被重写的最佳方法是什么?
不要使用 GET 请求进行修改!是RESTful;使用 POST(或 PUT)代替,浏览器应警告用户不要重新加载请求。重定向(使用 HTTP 重定向) 在 POST/PUT 请求之后使用普通 GET 请求发送到收据页面将可以刷新页面,而不会收到有关重新提交的警告。
EDIT:
我假设用户已以某种方式登录,因此您已经有了某种跟踪用户的方法,例如会话或类似的。
当显示将其存储为隐藏字段(除了反跨站请求令牌之外,我确信您已经拥有了),并且在会话变量(安全地存储在您的服务器上)中,当您收到此表单的 POST/PUT 请求时,您会检查时间戳是否与会话中的时间戳相同。如果是,您可以将会话中的时间戳设置为某个变量且难以猜测(例如与某些秘密字符串连接的时间戳),然后您可以保存表单数据。如果有人现在重复请求,您将不会在会话变量中找到相同的值并拒绝该请求。
这样做的问题是,如果用户单击返回更改某些内容,则表单无效,并且可能有点苛刻,除非您要更新的是金钱。因此,如果您遇到“愚蠢”用户刷新并单击后退按钮从而意外重新发布某些内容的问题,只需使用 POST 就会提醒他们不要这样做,而重定向会降低这种情况的可能性。如果您遇到恶意用户的问题,您也应该使用时间戳,尽管它有时会让用户感到困惑,尽管如果用户故意一遍又一遍地发布相同的消息,您可能需要找到一种方法来禁止他们。如果恶意用户只是编写一个脚本来自动加载表单并提交随机垃圾,那么使用 POST、设置时间戳,甚至对整个数据库进行全面比较来检查重复的帖子,都毫无帮助。 (但是跨站点请求保护使这变得更加困难)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)