Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在不挂起浏览器的情况下使用耗时的XSLT?_Xslt_Captcha - Fatal编程技术网

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

在不挂起浏览器的情况下使用耗时的XSLT?,xslt,captcha,Xslt,Captcha,(注:是的,这是一个荒谬的问题,如果这个问题的答案是“否”,我将完全不感到惊讶。也就是说:) 我编写了一个XSLT样式表,故意在XML片段上执行冗长的、不可并行的计算。它的目的是作为一个组件,在web浏览器中用作一种验证码,不需要用户的任何输入——当用户将数据发布到服务器时,计算结果将作为隐藏的表单元素提交。仅当计算值正确时,才接受表单内容。(计算的结构是这样的:服务器可以廉价地向用户提供函数的输入参数,服务器知道结果,而无需做大量工作,但用户的机器必须花费周期来确定结果。) 转换工作得很好,但

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

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

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

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


编辑:伙计们,我知道recaptcha.net和其他替代方案。这是一个实验。我的目标是找出一个理论上的想法是否可以以一种对用户来说不太繁重的方式简化为实践。我不是在寻找替代实现,我在寻找一种不涉及Javascript的加密强验证码的方法。(如果我想使用Javascript,我会使用一种Javascript hashcash实现。)唯一的另一种基于浏览器的图灵完整语言是XSLT。请以提问的精神来考虑这个问题。 加载页面后,如果没有Javascript,您将无法执行XSLT转换并在同一页面的表单中使用其结果。我不知道为什么您的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名,否则它们不会适应。

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

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

  • 在网页上包含一个小的、隐藏的iframe,它指向获取xml文件的url,其中包含指向xslt计算引擎的样式表处理指令
  • 设计xslt文件,使输出生成重定向到URL,URL中编码有计算标记;i、 e.计算url:

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

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


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

    有什么理由不使用类似的代码吗?(就像,如果你让计算机做这项工作,它也可以是一台经过编程的机器来做。对于那些没有经过编程的用户来说,这将是一件麻烦事。有了recaptcha,整个活动至少提供了一些有用的输出……我没有想到刷新的想法,谢谢!这实际上给了我更多的计算灵活性。)现在。我也很欣赏iframe的数据点——很高兴知道只是我做错了什么。事实上,花了9年时间,所有主流浏览器都支持浏览器xslt:FF3.5、IE8、Chrome 3、Safari 4、Opera 9:所有的东西都支持它,即使在公共网站上也是可行的选择。