предотвращение csrf в php

Не совсем верно. Локальные переменные должны быть инициализированы только в качестве ссылки. Локальная переменная может быть оставлена ​​неинициализированной, если ее не ссылать. Например:

int x;  // Valid
int y;
println("y=" + y);  // Not valid since y's value has never been assigned
21
задан yretuta 23 November 2009 в 01:26
поделиться

2 ответа

Чтобы предотвратить CSRF, вам нужно проверить одноразовый токен, POST'ed и связанный с текущим сеансом. Примерно так. . .

На странице, где пользователь запрашивает удаление записи:

confirm.php

<?php
 session_start();
 $token = isset($_SESSION['delete_customer_token']) ? $_SESSION['delete_customer_token'] : "";
 if (!$token) {
     // generate token and persist for later verification
     // - in practice use openssl_random_pseudo_bytes() or similar instead of uniqid() 
     $token = md5(uniqid());
     $_SESSION['delete_customer_token']= $token;
 }
 session_write_close();
?>
<html>
<body>
<form method="post" action="confirm_save.php">
 <input type="hidden" name="token" value="<?php echo $token; ?>" />
Do you really want to delete?
<input type="submit" value=" Yes " />
<input type="button" value=" No " onclick="history.go(-1);" />
</form>
</body>
</html>

Затем, когда дело доходит до фактического удаления записи:

confirm_save.php

<?php
 session_start();
 // validate token
 $token = isset($_SESSION['delete_customer_token']) ? $_SESSION['delete_customer_token'] : "";
 if ($token && $_POST['token'] === $token) {
   // delete the record
   ...
   // remove token after successful delete
   unset($_SESSION['delete_customer_token']);
 } else {
   // log potential CSRF attack.
 }
 session_write_close();
?>

Токен должен быть трудным для предположение, уникально для каждого запроса на удаление, принимается только через $ _POST и истекает через несколько минут (срок действия не показан в этом примере).

46
ответ дан 29 November 2019 в 04:09
поделиться

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

В прошлом проблемы с различными технологиями и браузерами (flash..et al) допускались. подделка реферальных заголовков. Это нужно учитывать. Существует несколько методов, использующих javascript для ссылки на ресурсы, где реферальные данные отсутствуют / передаются в заголовке запроса.

Это поведение несколько различается в зависимости от браузера. Если вы используете javascript для отправки формы, вы обычно в порядке. Если вы используете что-то вроде window.location, скорее всего, вам не следует ожидать наличия реферальных данных.

4
ответ дан 29 November 2019 в 04:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: