Pergunta

(. NB .: Sim, esta é uma pergunta ridícula, e eu vou ser totalmente surpreso se a resposta a esta pergunta é "não" Dito isto:)

Eu escrevi uma folha de estilo XSLT que deliberadamente executa um cálculo demorado, unparallelizable em um fragmento XML. É destinado como um componente de um sistema prova-de-obra para ser usado em um navegador da web como uma espécie de CAPTCHA que não requer nenhuma entrada do usuário - o resultado do cálculo fica submetido como um elemento de formulário oculto quando o usuário envia dados para o servidor. O conteúdo do formulário só são aceites se o valor calculado é correta. (O cálculo é estruturado de tal forma a que o servidor pode mais barato fornecer ao usuário com parâmetros de entrada para uma função, e o servidor sabe o resultado sem ter que fazer um monte de trabalho, mas a máquina do usuário tem que gastar ciclos para determinar a resultar.)

A transformação funciona muito bem, mas, infelizmente, trava o navegador enquanto o cálculo está acontecendo. Desde que meu objetivo é ter esse cálculo em execução enquanto o usuário continua a usar o navegador, isso é inaceitável comportamento irritante. Existe uma maneira de fundo a transformação e deixar o utilizável navegador enquanto ele é executado? Um pensamento que tive foi para carregar o fragmento XML de origem a partir de um iframe, mas eu não tenho sido capaz de obter a transformação para trabalhar em tudo usando esta abordagem. Pensei em perguntar aqui para ver se alguém tem alguma idéias brilhantes antes de bater minha cabeça contra isso muito mais longe -. Se eu estou tentando fazer algo que é fundamentalmente impossível dada a forma como navegadores de trabalho, seria bom saber

Eu sei que eu poderia fazer isso em JavaScript, mas seria bom para não ter que. Alguma idéia?

EDIT: Gente, eu sei sobre recaptcha.net e outras alternativas. Esta é uma experiência . Meu objetivo é descobrir se uma ideia teórica pode ser reduzida a prática de uma forma que não é demasiado onerosa para o usuário. Eu não estou olhando para implementações alternativas, eu estou procurando uma maneira de fazer um criptograficamente forte CAPTCHA que não envolve Javascript. (Se eu quisesse usar Javascript, eu usaria uma das implementações hashcash Javascript.) O único outro navegador baseado em linguagem Turing-complete lá fora é XSLT. Por favor, considere a questão no espírito em que foi perguntado.

Foi útil?

Solução

Eu uso xslt em um iframe, e ele funciona muito bem -. Provavelmente há algum problema relacionado você está correndo em

Se desejar a máquina para enviar um valor particular, sem interação do usuário e sem javascript, considere usar usando meta refresh:

  1. Incluir uma pequena iframe, escondido na página da Web que aponta para uma url recebendo seu arquivo xml que inclui uma diretiva de processamento de folha de estilo para o seu motor xslt computação
  2. Engenharia do arquivo XSLT tal que a saída gera um redirecionamento para uma URL com a computação sinal codificado no url; ou seja, compute a url:

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

Quando a seção ellided contém o token. Isso deve, em princípio, o trabalho.

Por outro lado, eu duvido seriamente que XSLT é muito útil para algo como isto. Browsers pode abortar o cálculo se leva muito tempo; mesmo em um iframe você pode ficar bloqueando comportamento, em sistemas de núcleo único, mesmo sem bloqueio comportamento pode ser efetivamente bloquear, as diferenças de motores XSLT são tais que você seria duramente pressionado para encontrar uma transformação que cada motor executa rápido o suficiente, mas nenhum chama através de quase instantaneamente.

Eu não acho javascript seria muito bom para isso, e XSLT é provavelmente ainda menos apropriado. Se você realmente quer tal cálculo, o Silverlight pode ser uma aposta melhor - pelo menos lá você pode escrever código que executa em todos os lugares razoavelmente rapidamente, mas que nenhum motor de futuro jamais poderia banalizar (é perto o suficiente para velocidade nativa que você deve ser capaz de escrever código que é bastante próxima do ideal para um cpu -. certamente você pode vir dentro de um fator de 10, que provavelmente não pode ser dito para javascript / XSLT)

Outras dicas

Você não será capaz de executar uma transformação XSLT após a página é carregada e usar o seu resultado em um formulário na mesma página sem Javascript. Eu não sei por que sua solução IFrame não trabalho, mas mesmo que o fizesse, você ainda precisa de Javascript para importar o resultado em forma da página.

Meu conselho seria a utilização de um sistema baseado em Javascript pequeno e rápido e fallback para reCAPTCHA se Javascript está desativado. Você não precisa fazer a prova-de-trabalho-intensivo da CPU, qualquer solução personalizada vai jogar fora a grande maioria (se não todos) dos spambots lá fora.

Por exemplo, a sua página poderia conter algo como

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

e defina o valor de c para (a + b) em Javascript. Bot decisores seria necessário para adaptar os seus bots especificamente para o seu site, a fim de resolver o CAPTCHA extremamente simples. E se o fizerem (que eles não), em seguida, adicionar um novo campo que vai definir que tipo de operação a ser executada em um e b para obter c. E se eles se adaptar novamente, altere o nome dos campos. Em toda a probabilidade, eles não vão se adaptar a menos que seu site passa a ser no top 10 do Alexa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top