(N.B。:是的,这是一个荒谬的问题,如果这个问题的答案是“不”,我将完全不会感到惊讶。那说:)
我编写了一个XSLT样式表,故意对XML片段执行冗长,不可并行的计算。它旨在作为proof-of-work system的一个组件在Web浏览器中用作一种不需要用户输入的CAPTCHA - 计算结果在作为隐藏表单元素时提交用户将数据POST到服务器。仅当计算值正确时,才接受表单内容。 (计算的结构使得服务器可以廉价地向用户提供功能的输入参数,并且服务器知道结果而不需要做很多工作,但是用户的机器必须花费周期来确定结果。)
转换工作正常,但遗憾的是,在计算过程中挂起浏览器。由于我的目标是在用户继续使用浏览器的同时运行此计算,这是令人无法接受的烦人行为。 有没有办法对转换进行后台处理并让浏览器在运行时保持可用?我曾经想过要从iframe加载源XML片段,但是我无法获得转换使用这种方法工作。我想我会在这里询问是否有任何人有任何好的想法,然后再打我的头 - 如果我试图做一些根本不可能的东西,考虑到浏览器的工作方式,那就很高兴知道了。 / p>
我知道我可以在Javascript中执行此操作,但不必这样做会很好。有什么想法吗?
编辑:伙计们,我知道recaptcha.net和其他替代品。这是实验。我的目标是找出理论上的想法是否可以减少到以对用户来说不太繁重的方式实践。我不是在寻找替代实现,我正在寻找一种方法来做一个不涉及Javascript的加密强CAPTCHA。 (如果我想使用Javascript,我会使用其中一个Javascript hashcash实现。)唯一的其他基于浏览器的图灵完整语言就是XSLT。请根据问题的精神考虑这个问题。
答案 0 :(得分: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)。 Bot制造商需要专门针对您的网站调整他们的机器人才能解决这个非常简单的CAPTCHA。如果他们这样做(他们不会这样做),那么添加一个新字段,该字段将定义在a和b上执行哪种操作以获得c。如果他们再次适应,请更改字段的名称。在所有可能的情况下,除非您的网站恰好位于Alexa的前10名,否则他们将无法适应。
答案 1 :(得分:1)
我在iframe中使用xslt,它运行得很好 - 你可能遇到了一些不相关的问题。
如果您希望机器在没有用户交互且没有javascript的情况下提交特定值,请考虑使用元刷新:
设计xslt文件,使输出生成重定向到URL,并在url中编码计算标记;即计算网址:
&lt; meta http-equiv =“refresh”content =“0; url = http://xyz.abc/captcha?......”&gt;
椭圆部分包含您的令牌。原则上应该这样做。
另一方面,我严重怀疑xslt对于这样的事情非常有用。如果需要很长时间,浏览器可能会中止计算;甚至在iframe中你可能会遇到阻塞行为,在单核系统上甚至非阻塞行为可能会有效阻塞,XSLT引擎的差异使得你很难找到每个引擎执行得足够快但没有几乎立即开火。
我认为javascript不会对此非常好,而XSLT可能更不合适。如果你真的想要这样的计算,那么Silverlight可能是一个更好的选择 - 至少在那里你可以编写在任何地方合理快速执行的代码但是没有未来的引擎可以轻易实现(它足够接近本机速度,你应该能够编写代码,对于一个cpu而言是非常接近最佳 - 当然你可以在10倍之内,这可能不能用于javascript / XSLT)。