Защита вызовов jquery ajax

Недавно я начал копаться в jQuery ajax. Я сделал много улучшений, но я не уверен в одном пункте. Как защитить мои вызовы 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 заботится об удалении ссылки с linkin POST linkid. Насколько мне известно, можно отправить форму сообщения на внешний URL. Это означает, что каждый сможет посмотреть мой исходный код и сделать свои собственные формы сообщений, выбрав их собственный linkid. Таким образом, они могут удалить все ссылки, которые они хотят.

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

www.example.com/user/delete/20

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

www.example.com/user/delete/21

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

Ответ 3

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

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

    if ((UserID!=0)||(UserID!= null))
    {
        //delete action code
    }