Защитите функцию jQuery от внешнего доступа

Я использую jQuery в приложении, которое регистрирует пользовательские щелчки для выполнения данного действия через .click () привязка, и я хочу, чтобы эта функциональность была доступна только через пользователя mousedown. Сегодня один из моих друзей указал, что возможно выполнить $ (элемент) .click () от терминала JavaScript в Firebug (или что-то подобное) и достигнуть той же функциональности как нажатие на элемент - что-то, что я хотел бы предотвратить. Какие-либо идеи о том, как пойти о выполнении этого? Спасибо за Ваш вход.

8
задан man1 23 July 2010 в 06:04
поделиться

4 ответа

Короткий ответ: Нет, вы не можете предотвратить это.

Длинный ответ: Любое событие, такое как событие клика, связано с так называемыми обработчиками событий. Эти обработчики представляют собой функции, которые выполняются при наступлении данного события. Так, если вы щелкаете на элементе, браузер проверяет, привязаны ли к нему обработчики событий, если да, то запускает их. Если нет, браузер попытается поднять событие до родительских элементов, снова проверяет, есть ли обработчики событий, привязанные к этому виду события... и так далее. Метод

jQuerys .trigger() (это то, что вы на самом деле вызываете при вызове .click(), например) просто делает то же самое. Он вызывает обработчики событий, которые привязаны к определенному элементу, для определенного события.

EDIT

Есть несколько простых способов мягкого обнаружения реального клика, например, вы можете проверить свойство toElement в объекте события. Это свойство не устанавливается при срабатывании. Но, опять же, это можно легко подделать с помощью trigger(). Пример:

$(document).ready(function() {
  $('#invalid2').bind('click', function(e){
      alert('click\nevent.target: ' + e.toElement.id);
      console.log(e);
  });

  $('#invalid1').bind('click', function(){
      $('#invalid2').trigger({
          type: 'click',
          toElement: {id: 'Fake'}
      });
  });
});​

Рабочий пример: http://www.jsfiddle.net/v4wkv/1/

Если бы вы просто вызвали $('#invalid2').trigger('click'), то свойства toElement не было бы и, следовательно, произошел бы сбой. Но, как вы видите, в объект event можно добавить все, что угодно.

10
ответ дан 5 December 2019 в 14:00
поделиться

Вы можете проверить объект события (который передается в качестве первого аргумента обработчику) originalEvent. Он будет неопределенным, если событие моделируется с помощью .click ()

Но это совершенно бесполезно. Вы не можете использовать javascript для безопасности - клиент имеет полный контроль над ним (а консоль firebug - самый очевидный инструмент). Проверки безопасности на стороне клиента должны быть только подсказкой для пользователя и защитой от ошибок, злонамеренный ввод может быть остановлен только на стороне сервера.

0
ответ дан 5 December 2019 в 14:00
поделиться

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

Но почему это проблема? Если кто-то что-то меняет на стороне клиента, это влияет только на него. Или вы пытаетесь проверить какие-то данные? Это ДОЛЖНО всегда выполняться в бэкэнде, потому что вы никогда не можете быть уверены, что на самом деле ему отправлено.

1
ответ дан 5 December 2019 в 14:00
поделиться

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

Если вы не хотите, чтобы люди делали определенные вещи, перенесите функциональность на сервер.

Извините, что приношу плохие новости.

1
ответ дан 5 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: