3

(注意:是的,这是一个荒谬的问题,如果这个问题的答案是“否”,我完全不会感到惊讶。也就是说:)

我编写了一个 XSLT 样式表,它故意在 XML 片段上执行冗长的、不可并行的计算。它旨在作为工作量证明系统的一个组件,在 Web 浏览器中用作一种不需要用户输入的验证码——计算结果作为隐藏的表单元素提交时用户 POST 数据到服务器。仅当计算值正确时才接受表单内容。(计算的结构使得服务器可以廉价地为用户提供函数的输入参数,并且服务器无需做很多工作就知道结果,但用户的机器必须花费周期来确定结果。)

转换工作得很好,但不幸的是在计算进行时会挂起浏览器。由于我的目标是在用户继续使用浏览器时运行此计算,因此这是令人无法接受的烦人行为。有没有办法让转换成为背景并让浏览器在运行时保持可用?我的一个想法是从 iframe 加载源 XML 片段,但我无法使用这种方法让转换工作。我想我会在这里询问是否有人有任何绝妙的想法,然后再进一步反对我 - 如果我正在尝试做一些鉴于浏览器的工作方式根本不可能的事情,很高兴知道。

我知道我可以在 Javascript 中做到这一点,但最好不必这样做。有任何想法吗?

编辑:伙计们,我知道 recaptcha.net 和其他替代品。这是一个实验。我的目标是找出一个理论想法是否可以以一种对用户来说不太繁重的方式转化为实践。我不是在寻找替代实现,而是在寻找一种不涉及 Javascript 的加密强 CAPTCHA 的方法。(如果我想使用 Javascript,我会使用其中一种 Javascript hashcash 实现。)唯一的其他基于浏览器的图灵完备语言是 XSLT。请以提出问题的精神考虑问题。

4

2 回答 2

2

在页面加载后,您将无法执行 XSLT 转换,并在没有 Javascript 的情况下在同一页面中的表单中使用其结果。我不知道为什么您的 IFrame 解决方案不起作用,但即使它起作用,您仍然需要 Javascript 将结果导入页面表单。

我的建议是使用小型快速的基于 Javascript 的系统,如果禁用 Javascript,则回退到 reCAPTCHA。您不需要使工作量证明 CPU 密集型,任何自定义解决方案都会甩掉绝大多数(如果不是全部)垃圾邮件程序。

例如,您的页面可能包含类似

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

并在 Javascript 中将 c 的值设置为 (a+b)。机器人制造商需要专门调整他们的机器人以适应您的网站,以解决极其简单的验证码。如果他们这样做(他们不会这样做),那么添加一个新字段,该字段将定义对 a 和 b 执行哪种操作以获得 c。如果他们再次适应,请更改字段名称。除非您的网站恰好在 Alexa 的前 10 名中,否则他们很可能不会适应。

于 2009-08-05T02:40:49.040 回答
1

我在 iframe 中使用 xslt,它工作得很好——你可能遇到了一些不相关的问题。

如果您希望机器在没有用户交互且没有 javascript 的情况下提交特定值,请考虑使用元刷新:

  1. 在网页上包含一个小的隐藏 iframe,该 iframe 指向一个获取您的 xml 文件的 url,该文件包括一个指向您的 xslt 计算引擎的样式表处理指令
  2. 对 xslt 文件进行工程设计,使输出生成一个重定向到 URL 的重定向,其中计算令牌编码在 url 中;即计算网址:

    <meta http-equiv="refresh" content="0;url= http://xyz.abc/captcha ?......">

省略的部分包含您的令牌。原则上,这应该是可行的。

另一方面,我严重怀疑 xslt 对于这样的事情是否非常有用。如果需要很长时间,浏览器可能会中止计算;即使在 iframe 中,您也可能会遇到阻塞行为,在单核系统上,甚至非阻塞行为也可能实际上是阻塞的,XSLT 引擎的差异使得您很难找到每个引擎都执行得足够快但没有的转换几乎是瞬间爆发。

我不认为 javascript 对此非常有用,而 XSLT 可能更不合适。如果你真的想要这样的计算,silverlight 可能是一个更好的选择 - 至少在那里你可以编写在任何地方都可以相当快地执行的代码,但是未来的引擎永远不会轻而易举(它足够接近原生速度,你应该能够编写代码对于 cpu 来说非常接近最佳值 - 当然你可以在 10 倍之内,这对于 javascript/XSLT 可能不能这么说)。

于 2009-08-05T14:25:19.570 回答