Как да попречим на потребителите да използват 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
Просто се уверете, че потребителят е упълномощен да изпълни заявката от страна на сървъра. Има няколко начина да направите това, но това обикновено се прави, като ги накарате да влязат, да съхранят сесия със съответната информация на сървъра и със сесийна бисквитка, изпратена до клиента. Вашите скриптове от страна на сървъра трябва да проверят дали този потребител е упълномощен тогава (обикновено се прави вместо вас с много рамки).   -  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