代码之家  ›  专栏  ›  技术社区  ›  Meredith L. Patterson

在不挂起浏览器的情况下使用耗时的XSLT?

  •  3
  • Meredith L. Patterson  · 技术社区  · 16 年前

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

    我编写了一个XSLT样式表,故意在XML片段上执行冗长的、不可并行的计算。它的目的是作为 proof-of-work system 在web浏览器中用作一种不需要用户输入的验证码——当用户将数据发布到服务器时,计算结果作为隐藏的表单元素提交。仅当计算值正确时,才接受表单内容。(计算的结构是这样的:服务器可以廉价地向用户提供函数的输入参数,服务器知道结果,而无需做大量工作,但用户的机器必须花费周期来确定结果。)

    转换工作得很好,但不幸的是在计算过程中挂起了浏览器。由于我的目标是在用户继续使用浏览器时运行此计算,因此这是令人无法接受的恼人行为。 我的一个想法是从iframe加载源XML片段,但我根本无法使用这种方法使转换工作。我想我会在这里问一下,在我进一步讨论这个问题之前,是否有人有什么高明的想法——如果我试图做一些浏览器工作方式下根本不可能的事情,我很高兴知道。

    我知道我可以用Javascript来实现这一点,但如果不必这样做就好了。有什么想法吗?

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

    2 回复  |  直到 14 年前
        1
  •  2
  •   Josh Davis    16 年前

    您将无法执行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名,否则他们不会适应。

        2
  •  1
  •   Eamon Nerbonne    16 年前

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

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

    1. 设计xslt文件,使输出生成重定向到URL,URL中编码有计算标记;i、 e.计算url:

      < http://xyz.abc/captcha

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

    我认为javascript在这方面不是很好,XSLT可能更不合适。如果您真的想要这样的计算,silverlight可能是一个更好的选择-至少在那里您可以编写在任何地方都可以相当快地执行的代码,但未来的引擎永远不会轻视它(这已经足够接近本机速度,您应该能够编写非常接近cpu最佳状态的代码-当然,您可以在系数10之内,这对于javascript/XSLT来说可能是不可能的)。