Запретить вызов функции JavaScript из адресной строки

StackOverflow https://stackoverflow.com/questions/424524

Вопрос

Я работал над сайтом онлайн-игры.Есть какое-то событие, которое вызывает функцию javascript, и функция выполняет какое-то действие с обратным вызовом.

что-то вроде этого,

 <input type="button" onclick="changeSomething"/>


 function changeSomething() {
         /// some call back, which changes something 
 }

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

Очень маловероятно, что кто-то это сделает, но я хочу это позволить.

Есть ли способ предотвратить подобную ситуацию?

Спасибо.

P.S.Я попробовал, но все еще не уверен, что достаточно хорошо объяснил.Пожалуйста, дайте мне знать, если вы что-то не получаете.

Это было полезно?

Решение

Вы никогда не сможете получить 100% защиту от любой техники, которую вы попробуете.Это проигрышная игра.

Сказав, что один из способов приблизиться к вашей цели — полностью удалить атрибут onclick и связать обработчик кликов (т. е. «changeSomething») с помощью javascript:

HTML:

<input id="foo" type="button" />

js:

addEvent(document.getElementById("foo"), 'click', function() {
    /// some call back, which changes something
})

Тогда обратный вызов становится анонимным (например, функции «changeSomething» больше нет).Эти злые пользователи не смогут вызвать его напрямую, если не знают его имени!

Есть еще способы обойти эту технику, но мы не будем упоминать о них, чтобы не подкинуть злодеям идеи :)

(Кстати, addEvent — это всего лишь пример библиотечной функции для добавления обработчиков событий.Я уверен, что у вас есть доступ к одному.Если не Ну вот.)

Другие советы

Я не думаю, что вы можете что-то с этим поделать.Клиент может запускать все, что захочет, в своем браузере.Единственное, что нужно сделать, это проверить все на стороне сервера.Это важная концепция во всем веб-программировании.Код на стороне клиента можно свободно изменять, и его следует рассматривать как дополнительную проверку для ускорения работы, а не как метод обеспечения безопасности.

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

Не беспокойтесь о вызове JavaScript (обойти это невозможно) и выполните ту же проверку, которую вы делали на внешнем интерфейсе на внутреннем сервере.Таким образом, вы можете просто забыть о защите своего внешнего интерфейса, поскольку вы все равно не сможете...но вы по-прежнему не позволяете злоумышленникам doSomethinging, когда они не должны этого делать.

Дайте мне знать, если вам нужны дополнительные разъяснения того, что я имею в виду, но мне понадобится более подробная информация об архитектуре вашего приложения.

Любое «решение» будет столь же эффективным, как отключение щелчка правой кнопкой мыши на веб-странице...Для последней проблемы я нашел как минимум с десяток обходных путей, включая просмотр страницы в Opera!

Если вы отключите это, можно будет обойти это с помощью Firebug, Greasemonkey или даже какого-либо прокси, изменяющего HTML на лету, не говоря уже об использовании локальной копии страницы и т. д.

Вы можете проверить источник клика, передав идентификатор:

<input id="good' type="button" onclick="changeSomething(this.id)"/>

 function changeSomething(myId) {
   if(myId!='good') {
    return;
  }

 //......code
}

Пересмотрено:

<input id="good' type="button" onclick="changeSomething(this)"/>

     function changeSomething(myId) {
       if(myId.id!='good') {
        return;
      }

     //......code
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top