java — запись вставки php Android предотвращает DOS-атаку и csrf-атаку при множественной отправке

  1. Я новичок в разработке для Android. Я разработал приложение для Android, из которого можно вставить некоторую запись через приложение в базу данных mysql, используя php для программирования на стороне сервера.
  2. Нет необходимости выполнять какие-либо операции входа в систему для вставки записи через приложение.
  3. Итак, теперь проблема в том, что если пользователь нажимает кнопку sumbit несколько раз (скажем, x раз) в течение доли секунды, то одна и та же запись будет вставлена ​​в базу данных несколько раз (x раз) … очевидно, с другим идентификатором первичного ключа в каждый ряд.
  4. Поэтому мне нужно предотвратить это, сгенерировав уникальный токен в oncreate () и передать токен вместе с запросом body body и проверить его на стороне сервера с помощью php.
  5. Токен должен быть уникальным для каждого пост-запроса через приложение к серверу, а также он должен быть уничтожен после использования для определенного запроса.
  6. Так как же пойти на это? Пожалуйста, помогите .. мне нужен код ссылки, если кто-нибудь может предоставить ..

-6

Решение

Облегченный подход заключается в создании токена, который может самостоятельно проверяться с использованием HMAC. На сервере вы сгенерируете токен с помощью скажем generate_token($secret) и отправьте это клиенту. Клиент должен включить токен в свой ответ. Проверьте токен на сервере с помощью valid_token($secret, $token),

Чтобы предотвратить повторное использование токенов, вы должны хранить потраченные токены. Например, вы можете сохранить использованные токены в db-записи с уникальным ограничением перед выполнением запроса. Если вставка не удалась в ограничении, вы знаете, что токен был использован повторно.

Пример генерации и проверки токена:

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]);
}

Есть и другие способы. Вы можете генерировать случайные идентификаторы и хранить их. Затем удалите их из магазина, как только они будут использованы. Тогда тебе не нужен секрет. Я предпочитаю хранить потраченные токены, потому что до последнего шага в нем нет состояния.

Изменить: Обратите внимание, что для защиты от CSRF токен должен включать в себя идентификатор пользователя. В PHP session_id() часто можно использовать для этого. Очень упрощенный подход позволил бы session_id() в $secret как в generate_token($secret . session_id()) а также valid_token($secret . session_id(), $token), Я надеюсь, вы поняли идею.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]