我有一个游戏,我的JavaScript通过POST调用PHP脚本来更改数据库中的值。如何防止某人反复复制请求并给自己十亿分?
现在我通过sha1()
传递密码并检查它是否在PHP端,但这不会阻止有人重复请求。
我无法使用时间戳,因为调用(JS POST请求)和运行PHP脚本之间的时间会过去。
答案 0 :(得分:2)
听起来很多这种逻辑现在仍然是客户端,所以你不能阻止某人多次发送“score.php?score = 1000”。
向服务器端添加逻辑,用于检查给定请求执行的频率,或者更好的是,完全在服务器端执行游戏逻辑(因此用户不必提交自己的分数,而只是请求某个游戏要执行的动作,最终导致得分然后可以添加到用户)。
答案 1 :(得分:1)
如果您有某种形式的会话标识符,则可以增加请求的次数。这不是防弹,但清除会话cookie将允许再次发出请求。
您需要某种形式的登录才能阻止某人清除其Cookie,甚至是cURL脚本循环。
编辑:
作为一种权宜之计,您可以添加一种CSRF保护形式,需要将一次性使用的哈希值应用于每个请求以使其有效。
答案 2 :(得分:0)
当你真的想要更新数据库中的值时,你也可以从post发送一个标志,你可以设置为任何值,否则将其设置为0.并且在更新时检查标志的值并相应地更新它。
答案 3 :(得分:0)
鉴于GET或POST都可以由客户轻松完成。如果你只是将原始分数发送到服务器,这永远不会是好事。我从来没有写过一个游戏,客户端会发生那么多逻辑。客户端应该只向服务器发送命令,服务器决定这是否是有效的事务/状态。或多或少,服务器知道客户端的状态,客户端只是反映了这一点。这可能是保证客户正在做的事情是合法的唯一真实方式。
答案 4 :(得分:-3)
使用captcha
Wiki CAPTCHA,reCAPTCHA
另外,使用Session
将我的用户number of repeated requests
写入服务器,并在每次成功请求时记下increment
,然后阻止用户在session storage data
的帮助下访问您的PHP脚本。 PHP SESSIONS