Защита вызовов jquery ajax - PullRequest
10 голосов
/ 02 ноября 2010

Недавно я начал копаться в ajax-функции jquery. Я сделал много улучшений, но я не уверен в одном. Как обезопасить мои AJAX звонки ..

Например, этот код для удаления ссылки:

// Delete link
$('.delete_update').live("click",function() {
    var ID = $(this).attr("id");
    var dataString = 'linkid='+ ID;

    if(confirm('<?php echo _("Are you sure you want to delete this link?");?>')) {

        $.ajax({
            type: "POST",
            url: "ajaxsave.php",
            data: dataString,
            cache: false,
            success: function(html){
                $(".bar"+ID).fadeOut('slow', function() {$(this).remove();});
            }
        });

    }
    return false;
});

Как показывает пример, ajaxsave.php заботится об удалении ссылки с помощью matchin POST linkid. Насколько мне известно, можно отправить форму сообщения на внешний URL. Это означает, что каждый сможет посмотреть на мой исходный код и создать свои собственные почтовые формы, выбрав свой собственный linkid. Таким образом, они могут удалить все ссылки, которые они хотят.

Как мне защитить свой код? Http реферер в ajaxsave.php? Скручивание скриптов могло бы испортить это. - Используете сеанс или куки на странице, вызывающей функцию ajax? Сохранение сеанса в базе данных и проверка его в ajaxsave.php?

Можете ли вы помочь мне? Как вы делаете это элегантно. Или что является "нормальным" на всех этих современных сайтах AJAX ..

Ответы [ 3 ]

11 голосов
/ 09 декабря 2010

Это может быть слишком поздно, чтобы быть полезным, но простой ответ таков:

В ajaxsave.php вам нужно проверить, что запрос поступил от аутентифицированного (авторизованного) и авторизованного (имеет право удалить эту ссылку) пользователя. Если вы этого не делаете, то ваш сайт определенно находится в опасности.

При желании вы можете просто решить, что все прошедшие проверку пользователи заслуживают доверия и могут удалить все, что захотят. Вам все равно нужно проверить аутентификацию в ajaxsave.php.

7 голосов
/ 02 ноября 2010

Вы должны обрабатывать это на сервере, независимо от того, что вы делаете на клиенте (то есть в браузере).Базовый дизайн веб-приложения связан с аутентификацией и авторизацией.Первый - «Ты тот, кем говоришь», обрабатывается при входе в систему, а второй - «есть ли у тебя разрешение делать то, что ты пытаешься сделать».Вы должны обрабатывать авторизацию на сервере - первое, что вы должны сделать, это убедиться, что у пользователя есть необходимые полномочия для выполнения того, что вы пытаетесь сделать.

когда вы говорите«Насколько мне известно, можно отправить форму сообщения на внешний URL-адрес.Это означает, что каждый сможет посмотреть на мой исходный код и создать свои собственные почтовые формы, выбрав свой собственный linkid.Таким образом, они могут удалить все ссылки, которые они хотят.Вы обеспокоены тем, что кто-то может посмотреть на ваш javascript, увидеть URL-адрес, а затем создать форму на своем веб-сайте, которая указывает на ваш URL-адрес?Это невозможно из-за одинаковой политики происхождения, которую реализуют все браузеры.Такая же политика происхождения означает, что если вы находитесь на www.example.com, вы не можете сделать запрос ajax на www.example2.com (среди прочего).Поэтому кто-то не смог настроить www.example2.com, а затем попытаться опубликовать на www.example.com (ваш сайт) с помощью ajax.Вы можете сделать это любым другим набором инструментов.

Например, ничто не мешает пользователю ввести URL-адрес в браузере и попытаться манипулировать вашей системой.Например, вы можете удалить пользователя по адресу

www.example.com / user / delete / 20

, что означает удаление пользователя с идентификатором 20. Как только я это увижу, я смогупросто введите в браузере

www.example.com / user / delete / 21

, даже если вы не предоставили мне ссылку на этот URL.Итак, как я и сказал, вам нужно убедиться, что у меня есть необходимые привилегии для удаления пользователя 21.

0 голосов
/ 19 августа 2014

Ну, я скажу вам один способ. Вы можете аутентифицировать входящие запросы

с проверкой сеанса внутри сервисной функции.

    if ((UserID!=0)||(UserID!= null))
    {
        //delete action code
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...