【问题标题】:How to prevent AJAX request hack?如何防止 AJAX 请求黑客攻击?
【发布时间】:2016-09-03 17:17:43
【问题描述】:

我有一个存储用户分数的 MySQL 表。每次用户正确回答问题时,我都会使用 AJAX 请求将他或她的分数加一。请求只发送一个整数,它是问题的 id。

我的问题是:如何防止虚假 AJAX 请求?

由于它只是一个整数,我无法检查它是否是虚假请求。所以我想出的唯一解决方案是在我的表中添加一个额外的列,名为“yesterday_score”,因为它的名称描述它是一个在时间 00:00 更改并保存用户分数的列。如果用户在一天内添加了超过 300 的分数,我认为这是一个 hack,我会阻止它。

【问题讨论】:

标签: mysql ajax


【解决方案1】:

检查然后回答您的后端以递增,而不是前端。

永远不要相信用户输入第一条规则!

【讨论】:

  • 答案不发送,用户在四个选项之间选择答案,它只是一个整数(question_id)发送到一个php页面,如果是1到500之间的数字,完全可以被php代码接受。
  • @coolesterman 这就是我的意思!通过检查JS中的答案,意味着JS有正确的答案,检查用户的答案,以便用户作弊。唯一的解决方案是在您的服务器中保密正确答案,并将用户答案发送到您的服务器。
  • 感谢@Tom 的回答。但用户必须知道他正确回答了问题。是个教育类网站,真的很抱歉,忘记说问题里,JS马上把正确答案变成绿色。
  • 后端可以返回一些东西,这样JS就可以告诉用户答案是否正确。
  • OH @TOM 我想我明白你的意思了。你的意思是我应该将“question_id”和“用户选择的答案”发送到服务器,如果它是正确的答案,我会告诉用户“哦,是的,你的答案是正确的”。但是他仍然可以发送“100 beautiful”一百万次,我的代码会说好的,问题编号“100”的答案是“beautiful”,所以他明白了。对不起,我不明白。
【解决方案2】:

您可以使用数据库使用的语言来更新号码,而不是将号码发送到数据库。所以在 MySQL 中

UPDATE users SET score = score + 1 WHERE user_id = 12

user_id 可以通过将其与会话或类似的东西进行比较来验证。一定要使用准备好的语句。

【讨论】:

  • 分数不只是每个用户的一个数字。每个用户都有300分,我应该知道他回答了哪个问题。
【解决方案3】:

我阅读了很多相关页面,一些用户提出了一些解决方案,例如:“如果用户在 10 毫秒内爆头 10 次,那么你就踢他。编写一个聪明的作弊检测算法。” 同样的问题也有答案:

在这种情况下无法避免伪造请求,因为客户端 浏览器已经拥有发出请求所需的一切;这是 恶意用户只需进行一些调试即可弄清楚如何 向您的后端发出任意请求,甚至可能使用 你自己的代码使它更容易。你不需要“加密 技巧”,您只需要混淆,这只会使伪造 有点不方便,但也不是不可能。

在这个页面: How to block external http requests? (securing AJAX calls)

我也可能使用 PHPIDS。但是知道我认为我会坚持我的解决方案,我添加另一列并保存用户的“昨天分数”,如果用户今天获得超过 100 分,我会知道他在作弊,所以我不会增加额外分数.

【讨论】:

    【解决方案4】:

    在表单中添加一个隐藏字段,并输入-md5(session_id())

    如果答案正确 - session_regenerate_id();

    【讨论】:

    • 不是表单,有一个问题和四个按钮,用户点击其中一个按钮作为答案,AJAX发送请求。
    • 在客户端回答检查?
    • 是的,因为用户应该知道,他正确回答了问题。 JS 立即将正确答案变为绿色。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多