Трудоемкий XSLT без зависания браузера? - PullRequest
3 голосов
/ 05 августа 2009

(НБ .: Да, это нелепый вопрос, и я буду совершенно не удивлен, если ответ на этот вопрос будет «нет». Это сказало:)

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

Преобразование работает просто отлично, но, к сожалению, браузер зависает во время вычислений. Поскольку моя цель состоит в том, чтобы эти вычисления выполнялись, пока пользователь продолжает использовать браузер, это недопустимо раздражающее поведение. Есть ли способ фонового преобразования и оставить браузер пригодным для использования во время его работы? Одна мысль, которая у меня была, - загрузить исходный XML-фрагмент из iframe, но я не смог получить преобразование в работать на всех, используя этот подход. Я решил спросить здесь, чтобы узнать, есть ли у кого-нибудь какие-нибудь блестящие идеи, прежде чем бить меня головой об этом гораздо дальше - если я пытаюсь сделать что-то, что принципиально невозможно, учитывая работу браузеров, было бы приятно узнать.

Я знаю, что мог бы сделать это в Javascript, но было бы неплохо не делать этого. Есть идеи?

РЕДАКТИРОВАТЬ: Ребята, я знаю о recaptcha.net и других альтернативах. Это эксперимент . Моя цель - выяснить, можно ли превратить теоретическую идею в практику, которая не слишком обременительна для пользователя. Я не ищу альтернативных реализаций, я ищу способ сделать криптографически стойкую CAPTCHA, которая не включает Javascript. (Если бы я хотел использовать Javascript, я бы использовал одну из реализаций хэш-кэша Javascript.) Единственный другой язык на основе браузера, основанный на языке Тьюринга, - это XSLT. Пожалуйста, рассмотрите вопрос в том духе, в котором он был задан.

Ответы [ 2 ]

2 голосов
/ 05 августа 2009

Вы не сможете выполнить XSLT-преобразование после загрузки страницы и использования ее результата в форме на той же странице без Javascript. Я не знаю, почему ваше решение IFrame не работает, но даже если бы оно работало, вам все равно понадобился бы Javascript для импорта результата в форму страницы.

Мой совет - использовать маленькую и быструю систему на основе Javascript и использовать reCAPTCHA, если Javascript отключен. Вам не нужно повышать нагрузку на процессор при проверке работоспособности, любое нестандартное решение отбросит подавляющее большинство (если не все) спам-ботов.

Например, ваша страница может содержать что-то вроде

<input type="hidden" name="a" value="123" />
<input type="hidden" name="b" value="456" />
<input type="hidden" name="c" />

и установите значение c в (a + b) в Javascript. Бот-производителям необходимо адаптировать своих ботов специально для вашего сайта, чтобы решить эту чрезвычайно простую CAPTCHA. И если они это сделают (что они не будут), то добавьте новое поле, которое определит, какую операцию выполнить с a и b, чтобы получить c. И если они адаптируются снова, измените имя поля. По всей вероятности, они не адаптируются, если ваш сайт не окажется в топ-10 Alexa.

1 голос
/ 05 августа 2009

Я использую xslt в iframe, и он отлично работает - возможно, вы столкнулись с какой-то не связанной проблемой.

Если вы хотите, чтобы машина отправляла определенное значение без взаимодействия с пользователем и без JavaScript, рассмотрите возможность использования метаобновления:

  1. Включите на веб-странице небольшой скрытый элемент iframe, который указывает на URL-адрес для получения вашего XML-файла, который включает в себя директиву обработки таблицы стилей для вашего механизма вычисления xslt
  2. Создайте файл xslt таким образом, чтобы выходные данные генерировали перенаправление на URL с токеном вычисления, закодированным в URL; то есть вычислите URL:

    http://xyz.abc/captcha?......">

Там, где в разделе с разделителями содержится ваш токен. Это должно в принципе сработать.

С другой стороны, я серьезно сомневаюсь, что xslt очень полезен для чего-то подобного. Браузеры могут прервать вычисления, если это займет много времени; даже в iframe вы можете получить блокирующее поведение, в одноядерных системах даже неблокирующее поведение может эффективно блокировать, различия в механизмах XSLT таковы, что вам будет сложно найти преобразование, которое каждый механизм выполняет достаточно быстро, но ни один почти мгновенно.

Я не думаю, что javascript был бы очень хорош для этого, а XSLT, вероятно, еще менее уместен. Если вам действительно нужны такие вычисления, Silverlight может быть лучшим выбором - по крайней мере, там вы можете написать код, который выполняется везде достаточно быстро, но ни один будущий движок никогда не сможет тривиализировать (он достаточно близок к собственной скорости, чтобы вы могли писать код, который довольно близко к оптимальному для процессора - конечно, вы можете попасть в коэффициент 10, что, вероятно, нельзя сказать о javascript / XSLT).

...