Android php插入记录在多次提交中防止DOS攻击和csrf攻击

Posted

技术标签:

【中文标题】Android php插入记录在多次提交中防止DOS攻击和csrf攻击【英文标题】:Android php insert record prevent DOS attack and csrf attack in multiple submit 【发布时间】:2018-08-08 02:54:40 【问题描述】:
    我是 android 开发新手。我开发了一个 android 应用程序,可以使用 php 作为服务器端编程,通过该应用程序将一些记录插入到 mysql 数据库中。 无需执行任何登录操作即可通过应用插入记录。 所以现在的问题是,如果用户在几分之一秒内多次(比如 x 次)单击 sumbit 按钮,那么相同的记录将多次插入数据库中(x 次)..显然不同的主每行的键 ID。 所以我需要通过在 oncreate() 中生成一个唯一令牌并将令牌与正文发布请求一起传递并使用 php 在服务器端对其进行验证来防止它发生。 对于通过应用程序到服务器的每个发布请求,令牌必须是唯一的,并且在用于特定请求后必须销毁。 那么如何去做呢?请帮助..如果有人可以提供,我需要一个参考代码..

【问题讨论】:

看来你对如何解决这个问题有一个很好的想法。另一种方法是只允许一次提交点击。 @KIKOSoftware 是的,我确实有..但我不知道如何在服务器端的 android 和 php 中实现它 @KIKOSoftware ok 一次提交点击..这太可能了..ok 让我试试 谁也可以帮助我解决独特的令牌解决方案..?? 【参考方案1】:

一种轻量级的方法是生成一个可以使用 HMAC 进行自我验证的令牌。在服务器上,您将使用generate_token($secret) 生成一个令牌并将其发送给客户端。客户端必须在其响应中包含令牌。使用valid_token($secret, $token) 验证服务器上的令牌。

为防止重复使用代币,您必须存储已用过的代币。例如,您可以在继续请求之前将使用过的令牌存储在具有唯一约束的数据库记录中。如果在约束上插入失败,您就知道令牌被重复使用了。

令牌生成和验证示例:

function generate_token($secret) 
  return build_token($secret, bin2hex(random_bytes(5)));


function build_token($secret, $id) 
  return $id . '-' . hash_hmac('ripemd160', $id, $secret);


function valid_token($secret, $token) 
  $parts = explode('-', $token);
  return $token === build_token($secret, $parts[0]);

还有其他方法。您可以生成随机 ID 并存储它们。然后在使用后将它们从商店中删除。那你就不需要秘密了。我更喜欢存储使用过的令牌,因为它在最后一步之前是无状态的。

编辑:请注意,为了防止 CSRF,令牌必须包含用户特定的 ID。在 PHP 中,session_id() 通常可以用于此目的。一种非常简单的方法是将session_id() 连接到$secret,如generate_token($secret . session_id())valid_token($secret . session_id(), $token)。我希望你能明白。

【讨论】:

..感谢您的帮助..我明白了您的观点...将尝试实施它

以上是关于Android php插入记录在多次提交中防止DOS攻击和csrf攻击的主要内容,如果未能解决你的问题,请参考以下文章

Aop+Redis防止接口重复提交

如何在提交按钮上多次单击时仅在数据库中插入一条记录

有哪些技术可以防止多次提交比赛?

php通过记录IP来防止表单重复提交方法分析

rabbitmq记录心得

jquery ajax如何防止多次提交