Как запретить пользователям использовать ссылки JavaScript

У меня есть веб-сайт, который делает вызовы AJAX к серверному скрипту при нажатии кнопки. Единственная проблема заключается в том, что пользователь может ввести в адресную строку следующее:
javascript:callAjaxRoutine(); Как мне предотвратить это?


person jhunter_d    schedule 19.04.2013    source источник
comment
Не стоит даже пытаться. Ваш дизайн должен быть таким, чтобы это не имело значения. Как это создает проблему для вас?   -  person Gerrat    schedule 20.04.2013
comment
Я думаю, что это невозможно сделать. Пользователи всегда могут, например, использовать firebug и изменить страницу или вызвать функции javascript. На стороне сервера вы всегда должны проверять полученные данные, потому что вы никогда не сможете на 100% доверять логике и проверке на стороне клиента.   -  person Walid    schedule 20.04.2013
comment
Как именно мне следует спроектировать свой сайт, для которого требуется вызов скрипта на стороне сервера, чтобы предотвратить это?   -  person jhunter_d    schedule 20.04.2013
comment
Я думаю, что смысл того, что говорит @Gerrat, заключается в том, что банк не будет помещать свою функцию addMoney(100000) в клиент. Вместо этого у вас будет какая-то функция transferFunds(from,to,amount). какая операция (которую ваш веб-сервис выставляет на всеобщее обозрение) может вызвать такую ​​проблему?   -  person Shanimal    schedule 20.04.2013
comment
Вы просто гарантируете, что пользователь авторизован для выполнения запроса на стороне сервера. Есть несколько способов сделать это, но обычно это делается путем входа в систему, сохранения сеанса с соответствующей информацией на сервере и отправки файла cookie сеанса клиенту. Сценарии на стороне вашего сервера должны проверить, авторизован ли этот пользователь (обычно это делается для вас во многих фреймворках).   -  person Gerrat    schedule 20.04.2013


Ответы (1)


Люди в комментариях правы, говоря, что вы никогда не сможете вывести кого-то из своего кода на 100%, но вы можете сделать несколько вещей, чтобы предотвратить менее серьезные проблемы:

  1. Инкапсулируйте свою функцию в объект, чтобы она не находилась в глобальном пространстве имен,
  2. Запутать свой код

No 1

это случай: (здесь я буду использовать jQuery, но это не обязательно, просто укорачивает код)

Вместо:

<script>
    var callAjaxRoutine = function () {
        // Do ajax
        ajax();
    }

    $('#button').on('click', callAjaxRoutine);

</script>

Вы берете функцию из глобального пространства имен и помещаете ее внутрь объекта:

<script>

    // This sets up an object containing a self-executing function
    (function () {

        var callAjaxRoutine = function () {
            // Do ajax
            ajax();
        }

        $('#button').on('click', function () {
            callAjaxRoutine.apply(this);
        });

    }());

</script>

Второй блок кода будет делать то же самое, что и первый, код по-прежнему вызывается при запуске события, но ввод callAjaxRoutine в консоль покажет undefined из-за закрытия функции, которая существует только для объявления и назначения callAjaxRoutine в качестве события. обработчик событий для #button.click()

javascript:callAjaxRoutine(); ничего не сделает, так как доступный callAjaxRoutine больше не определен.

No. 2

поместите свой код через минимизированный/обфускатор, такой как http://jscompress.com - вторая часть кода выше становится:

(function(){var e=function(){ajax()};$("#button").on("click",function(){e.apply(this)})})();

Чем больше функция, тем сложнее ее читать и понимать. Если у вас есть такой инструмент, как firebug, вы можете разобрать его на части, но это очень сложно сделать, так что вы отговорите большинство.

person Trolleymusic    schedule 19.04.2013
comment
Это на самом деле очень хорошая идея. - person jhunter_d; 20.04.2013