2010-07-23 179 views
8

我在注册用户点击以通过.click()绑定执行给定操作的应用程序中使用jQuery,并且我希望此功能通过用户mousedown仅可用于。我的一位朋友今天指出,可以从Firebug(或类似的)中的JavaScript终端运行$(element).click(),并实现与单击该元素相同的功能 - 我想要的避免。有关如何去做这件事的任何想法?感谢您的输入。从外部访问保护jQuery功能

+0

这是关于你认为这可能是可能的。你应该阅读更多关于安全性和开发过程。 (哦,我给你+1) – rook 2010-07-23 07:09:55

+0

任何推荐阅读?谢谢! – man1 2010-07-26 01:21:16

回答

10

简答:不,你不能真的阻止它。

龙答:喜欢click event任何事件势必会这样叫Event handlers。这些处理程序是functions,它们在给定事件发生时执行。因此,如果你点击一个元素,你的浏览器会检查是否有任何event handlers被绑定到它,如果是的话,它会fires它们。如果没有,浏览器将尝试bubble up事件到parent elements,再次检查是否有任何event handlers绑定这种事件..等等。

jQuerys.trigger()方法(如果你打电话给.click(),你实际调用的方法)只是做同样的事情。它将特定事件称为绑定到特定元素的event handlers

编辑

可能有一些简单的方法来somekind的的soft detect一个真正的点击,比如你可以检查一个event objecttoElement财产。 triggered时,该属性未设置。但是,再次,你可以很容易地伪造,以及.trigger()。例如:

$(document).ready(function() { 
    $('#invalid2').bind('click', function(e){ 
     alert('click\nevent.target: ' + e.toElement.id); 
     console.log(e); 
    }); 

    $('#invalid1').bind('click', function(){ 
     $('#invalid2').trigger({ 
      type: 'click', 
      toElement: {id: 'Fake'} 
     }); 
    }); 
});​ 

工作例如:http://www.jsfiddle.net/v4wkv/1/

如果您只需调用$('#invalid2').trigger('click')toElement财产不会在那里,因此失败。但正如你所看到的,你可以像event object一样添加任何东西。

+1

+1非常好的答案,我完全同意。 – rook 2010-07-23 07:09:00

+0

有道理。至少我可以在你的示例中使用你的技术来实现“invalid2”,以使其变得更难以欺骗。非常感谢这个伟大的答案。 – man1 2010-07-26 01:26:06

1

你想阻止什么?有人搞乱你的客户端脚本?你可以做一些事情,比如混淆你的代码,但除此之外别无他法。但即使这样做,只是让它更加麻烦,而不是我认为值得的。

如果您不希望人们做某些事情将功能移到服务器。

对不起,坏消息的持有者。

+1

模糊处理似乎是一种可怕的方式,可以防止用户搞乱自己的javascript。如果有人真的想要完成所有工作的麻烦,那么为什么不让他们? – LandonSchropp 2010-07-23 06:29:41

+0

@ helixed我同意。我说这是不值得的麻烦,但它是一个选项。我告诉他把它移到服务器上。 – spinon 2010-07-23 06:37:24

+0

好点的人,但我担心的不是有人*可以自己调用它,而是他们可以将它编写成可以频繁运行的东西。我需要事件只发生在人类点击鼠标的频率上。 (是的,它在每次通话时与我的服务器通信。) – man1 2010-07-26 01:24:07

1

你不能对它做任何事情,也可以编写完整的函数然后再启动它。

但是,为什么这是一个问题?如果有人正在改变某些客户端,它只会影响他。还是你想检查一些数据?这必须始终在后端完成,因为您永远无法确定发送给它的是什么。

0

您可以检查事件对象(作为第一个参数传递给处理程序)originalEvent。 如果事件被模拟,它将是未定义的。点击()

但它是完全没用的。你不能使用JavaScript来保证安全性 - 客户端可以完全控制它(而萤火虫控制台就是最明显的工具)。客户端安全检查应该只提示用户并防止错误,恶意输入只能在服务器端停止。