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

问题描述 投票:-6回答:1
  1. 我是android开发的新手。我已经开发了一个Android应用程序,可以通过应用程序将一些记录插入mysql数据库,使用php作为服务器端编程。
  2. 无需通过应用程序执行任何类型的登录操作来插入记录。
  3. 所以现在的问题是,如果用户在几分之一秒内多次点击sumbit按钮(比如说x次),那么相同的记录将被多次插入数据库(x次)。显然,不同的主键id在每一行。
  4. 所以我需要通过在oncreate()中生成一个唯一的标记来防止它,并将标记与body post请求一起传递,并使用php在服务器端验证它。
  5. 对于每个帖子请求,令牌对于服务器必须是唯一的,并且一旦用于特定请求,它就必须被销毁。
  6. 那怎么去呢?如果有人能提供,请帮助..我需要参考代码..
java php android csrf denial-of-service
1个回答
0
投票

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

为了防止重复使用令牌,您必须存储用过的令牌。例如,您可以在继续执行请求之前将使用过的令牌存储在具有唯一约束的db-record中。如果在约束上插入失败,则表示已重新使用该令牌。

令牌生成和验证的示例:

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)。我希望你明白这个主意。

© www.soinside.com 2019 - 2024. All rights reserved.