Достаточна проверка сервера заголовка X-Requested-With для защиты от CSRF для ajax-управляемого приложения?

library(dplyr)
mydf <- df1 %>%
  full_join(df2) %>%
  full_join(df3)

Вывод:

> mydf
   info     var1m pos_var1   var1   var2
1  C001        NA       NA     NA     NA
2  C002        NA       NA     NA     NA
3  C003 0.1790000        1 0.1790 1.1305
4  C004        NA       NA     NA     NA
5  C007 0.0645000        1 0.0645 0.2985
6  C010 0.3895000        1 0.3895 0.1705
7  C016 0.2805000        1 0.1740 0.3980
8  C017 0.7805001        1 0.4840 0.3375
9  C022        NA       NA 0.1740 0.3980
10 C023        NA       NA 0.4840 0.3375
24
задан Ciro Santilli 新疆改造中心法轮功六四事件 15 May 2016 в 08:01
поделиться

6 ответов

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

Статический токен - не лучшая идея. Токен должен создаваться не реже одного раза за сеанс.

EDIT2 Майк в конце концов не прав, извините. Я не прочитал должным образом страницу, на которую указал. В нем говорится:

Простой межсайтовый запрос - это тот, который: [...] Не устанавливает пользовательские заголовки с HTTP-запросом (например, X-Modified и т. Д.)

Следовательно, если вы установите X-Requested-With , запрос должен быть запущен заранее, и если вы отвечаете на предполетный запрос OPTIONS , разрешающий межсайтовый запрос, он не пройдет.

РЕДАКТИРОВАТЬ Майк прав, начиная с Firefox 3.5 межсайтовые запросы XMLHttpRequest разрешены . Следовательно, вам также необходимо проверить, соответствует ли заголовок Origin , если он существует, вашему сайту.

if (array_key_exists('HTTP_ORIGIN', $_SERVER)) {
    if (preg_match('#^https?://myserver.com$#', $_SERVER['HTTP_ORIGIN'])
        doStuff();
}
elseif (array_key_exists('HTTP_X_REQUESTED_WITH', $_SERVER) &&
        (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'))
    doStuff(); 
15
ответ дан 29 November 2019 в 00:23
поделиться
1
ответ дан 29 November 2019 в 00:23
поделиться

Краткий ответ: нет. Любой злоумышленник просто использует Ajax для атаки на ваш сайт. Вы должны сгенерировать случайный токен с коротким, но не слишком большим временем жизни, который вы будете обновлять при каждом ajax-запросе.

Вы должны будете использовать массив токенов в javascript, поскольку у вас может быть несколько ajax-запросов, выполняющихся одновременно.

0
ответ дан 29 November 2019 в 00:23
поделиться

То, что вы делаете, безопасно, потому что xmlhttprequest обычно не уязвим для подделки межсайтовых запросов.

Поскольку это проблема на стороне клиента, самым безопасным способом было бы проверить архитектуру безопасности каждого браузера: -)

(Это сводка; я добавляю этот ответ, потому что этот вопрос очень сбивает с толку, посмотрим, что говорят голоса)

0
ответ дан 29 November 2019 в 00:23
поделиться

Я не верю, что это безопасно. Одна и та же политика происхождения предназначена для предотвращения доступа документов из разных доменов к контенту, возвращаемому из другого домена. Вот почему в первую очередь существуют проблемы с XSRF. Как правило, XSRF не заботится об ответе. Он используется для выполнения определенного типа запроса, например, действия удаления. В простейшем виде это можно сделать с помощью правильно отформатированного тега img. Предлагаемое вами решение предотвратит использование этой простейшей формы, но не защищает кого-либо от использования объекта XMLHttp для выполнения запроса. Вам необходимо использовать стандартные методы предотвращения для XSRF.Мне нравится генерировать случайное число в javascript и добавлять его в файл cookie и переменную формы. Это гарантирует, что код также может записывать файлы cookie для этого домена. Если вам нужна дополнительная информация, см. эту запись .

Также, чтобы предупредить комментарии о том, что XMLHttp не работает в скрипте. Я использовал следующий код с firefox 3.5, чтобы сделать запрос в Google из html, запущенного в домене localhost. Контент не будет возвращен, но с помощью firebug вы можете увидеть, что запрос сделан.

<script>
var xmlhttp = false; 

if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
    try {
        xmlhttp = new XMLHttpRequest();
    } catch (e) {
        xmlhttp = false;
    }
}
if (!xmlhttp && window.createRequest) {
    try {
        xmlhttp = window.createRequest();
    } catch (e) {
        xmlhttp = false;
    }
}

xmlhttp.open("GET", "http://www.google.com", true);
xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4) {
        alert("Got Response");
        alert(xmlhttp.responseText)
    }
}

xmlhttp.send(null)
alert("test Complete");

1
ответ дан 29 November 2019 в 00:23
поделиться

Я не думаю, что это обеспечивает какую-либо защиту. Атакующий сайт все еще может использовать xmlhttprequest для межсайтового запроса в обход вашей проверки.

0
ответ дан 29 November 2019 в 00:23
поделиться
Другие вопросы по тегам:

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