好的,这个主题的标题真的很愚蠢 - 但我无法以更好的方式总结它。所以这里是我问题的更详细版本:
我正在创建一个小型JavaScript库,使开发人员能够将自定义事件的字符串发送到专用服务器(库中定义的URL)。让我们说这个库名为“testLib”,使用这个库的开发人员可以编写如下内容:
function success() {
testLib.send("Everything OK");
}
因此,每次调用此成功函数时,都会对在库内定义的服务器进行REST调用(POST请求)。到目前为止,这没问题。
但丑陋的是,每个拥有萤火虫或类似物的人都可以称之为“testLib.send()”方法。这真的很难看,因为这个库背后的洞感是跟踪仅开发人员定义的事件。当然,服务器将负责基本验证(原始检查,API密钥,..),但仍然:可以启动firebug并只调用“testLib.send”方法。
是否有机会建立一个授权机制,阻止“firebug用户”通过预定义的库方法发送休息呼叫?
答案 0 :(得分:3)
没什么实际的。
该库在客户端的计算机上运行。你无法控制它。他们可以根据自己的内容编辑JS。他们可以完全绕过它并发送手工制作的HTTP请求(如果他们想要的话)(或编写快速脚本来通过请求轰炸服务器)。
您实施的任何实际保护都必须在服务器上。
答案 1 :(得分:2)
你有两个选择可能会让它变得更难(虽然肯定不能通行):
1)完成后对脚本进行模糊处理和/或打包 - 尽管可以轻松绕过大多数混淆器 2)让你的方法检查谁调用它们 - 看看arguments.callee.caller。也就是说,这可能会在严格模式下遇到问题。
正如您所说,最好的办法是重复服务器端的任何验证。如果服务器端验证失败 - 这实际上告诉你一些事情:有人故意绕过你的Javascript,你可以相应地处理他。
希望这有帮助
TG
答案 2 :(得分:2)
如果您的应用程序在页面加载时对用户进行身份验证,那么来自客户端的每个请求都将附带身份验证cookie,因此基本上您将能够检测到发件人是谁。
但是如果你想阻止对该特定函数的编程访问,那么你最好的选择是函数关闭以使该函数变得私有且不可访问,并且一些代码混淆会阻止人们明显地重写整个东西。一个很棒的混淆是启用了Base62的Javascript packer。
但是这种事情当然会模糊你的图书馆,但公共可访问的功能仍然可以访问。
然而。如果您希望匿名用户阻止向您的服务器发送内容,则您无法真正做到这一点,但您可以通过让您的功能需要某种类型的开发人员(真实用户)注册密钥来识别未经授权的请求有,但是儿子不会。
也许Google上找到的其他一些资源可能对一口井有所帮助。只是为了划伤表面。例如,XHR允许用户发送用户名和密码来验证请求,这可能正是您所追求的。但是你应该知道更好,因为你有图书馆设计而不是我们。
答案 3 :(得分:1)
没有。因为javascript在客户端运行,所以你无法阻止某人自己阅读客户端正在执行的内容并执行它。您可以采取一些措施来混淆您的通话,但这是security through obscurity - 并且不应该依赖它。如果你想确保只有开发人员调用你的API,他们就需要在服务器端进行调用。