Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.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
Javascript 客户端-服务器通信和安全的api密钥_Javascript_Php_Ajax_Node.js_Security - Fatal编程技术网

Javascript 客户端-服务器通信和安全的api密钥

Javascript 客户端-服务器通信和安全的api密钥,javascript,php,ajax,node.js,security,Javascript,Php,Ajax,Node.js,Security,我需要一些建议。 我想构建一个JS应用程序,它将在客户端浏览器上运行,并与服务器上的ajax进行通信。 问题是我想给这个客户机一些api密钥,这样我就可以在我的服务器上对它进行授权。 从安全角度看,这是一个问题,因为只要这个密钥通过ajax调用发送,任何人都可以复制这个调用。 我不想让客户端创建一些代理服务器并“卷曲”请求。 我希望它直接从客户机到服务器。 除了通过IP或域验证客户端之外,最好的做法是什么?遗憾的是,您只能检查Referer标题,并发出带有允许的Referer白名单的API密钥

我需要一些建议。 我想构建一个JS应用程序,它将在客户端浏览器上运行,并与服务器上的ajax进行通信。 问题是我想给这个客户机一些api密钥,这样我就可以在我的服务器上对它进行授权。 从安全角度看,这是一个问题,因为只要这个密钥通过ajax调用发送,任何人都可以复制这个调用。 我不想让客户端创建一些代理服务器并“卷曲”请求。 我希望它直接从客户机到服务器。
除了通过IP或域验证客户端之外,最好的做法是什么?

遗憾的是,您只能检查
Referer
标题,并发出带有允许的Referer白名单的API密钥

这里的主要问题是
Referer
根本不安全:它可以更改。也就是说,任何人都可以模拟客户端

好吧,关键是你的客户应该能够重新创建他们的API密钥,一旦他们意识到有人在模仿他们,他们就应该这样做。他们应该继续创作直到坏人停止模仿他们

让它尽可能的难。。。 一种可能的方法是使用过期的访问令牌,以使不需要的客户端更难模拟实际客户端

此外,一个好的实践是,一个客户端每天可以请求有限数量的访问令牌。如果这些访问令牌有24小时的过期时间,并且每个API密钥和每天有3或4个访问令牌的限制,那么如果许多坏人试图模拟您的一个客户机,那么,只有3个能够这样做

您还可以定义每天访问令牌的限制。这可能使事情变得更加困难

顺便说一句,你可以说任何人都可以窃取整个访问令牌。现在是重新生成API密钥并获取新密钥的时候了。最后,这些坏人会厌倦让他们的访问令牌失效

最佳解决方案 实际上,如果您的API需要安全,并且它是私有的,正如您在我自己的回答中的一些评论中所说的,那么这里没有选择:您需要采用服务器代理方式


我会检查使用OAuth2来保护您的API。

您可以使用类似于

您可以创建一个身份验证对象

{
  apiKey: asd-dfgdf-e3234,  // not even necessary (read on)
  expires: 12213493434,
  ip: "x.x.x.x"
}
您可以对其进行base64编码,然后使用私钥(或服务器上的哈希函数)对其进行签名,并将签名作为base64字符串附加到“有效负载”中


把这个传给你的客户。每个请求都发送此令牌。可以检查并验证它是否无篡改(匹配请求的IP,无需密钥)。

AJAX无法跨域完成。“JSONP是另一回事儿。”夏洛特·奥利?“科尔斯是什么?”夏洛蒂·奥利问道?亚莉:你错了。样式表、图像甚至脚本等静态文件本身都是跨域的。CORS的引入是为了允许跨域请求AJAX(又称XmlHttpRequest)。@CharlotteDunois例如,当您对任何Google Maps API资源执行请求时,您的浏览器将首先执行一个带有动词选项的请求,以获取所需的CORS头,这样就可以通过传递默认的同源策略Duplicate来完成实际请求?所以它仍然没有帮助。如果我检查ip或域,它是否足够安全?就像我想有一个域名白名单,并检查服务器上的推荐人。Hacers可以复制此请求吗?@PazLazar IP也可以修改。。。你可以肯定,你的最佳选择是努力使事情变得困难,但没有办法100%肯定你的API会被预期和实际使用consumer@PazLazar我的建议也是谷歌等知名公司的设计决策。他们的地图JavaScript API就是这样工作的。。。API密钥和您的一样是公开的,您可以配置允许的引用者,并且每天的请求有配额限制…您必须理解-我不想尝试和限制-我必须。这不是一些天气或地图api,我可以限制和使坏人努力工作。存储在服务器上的数据是非常私有的,我的客户端不能让任何人看到它。因此,为客户机生成一些令牌不会有帮助,也不会使用referer。我唯一能做的就是让客户端使用服务器代理生成令牌,这是我给他的第一个调用的api密钥,然后在下一个调用中使用这个令牌…@PazLazar我已经理解了这一点,但你要求避免请求代理。。。如果你想要一个99%安全的系统,那么你必须走这条路。顺便说一句,有些人可以模仿某个网站或HTTP客户端,只是将请求粘贴到Fiddler或Postman中,然后使用整个访问令牌。如果你不在浏览器中存储访问令牌,那么任何人都可以通过某个客户端站点从Fiddler或Postman向你的API发出请求…………这没有帮助,因为如果我可以用JS加密它,任何其他黑客都可以解密它,甚至更糟——只是使用它……你不加密它。你签字。您获取base64文本并在服务器上签名。除非黑客拥有您的私钥,否则该“哈希”当前是不可逆的。黑客可以尝试修改令牌,但在服务器上快速检查(该有效负载签名是否有效)将发现伪造的令牌。如果有效,请检查IP和请求IP,以确保它们匹配。@Wainage BTW这还不够。。。还可以模拟源IP地址……。您实际上是在向客户端发送ID卡。若黑客截获了它,你们的服务器将在IP或签名上失败,你们将能够知道他们正在使用其他人的ID@Matias无法模拟IP。那会把交通送到别处。如果你是指中间人攻击,那么我希望你使用的是https。。。否则你所有的秘密都属于国家安全局。
eyBhcGk6IDEyMzQ1LTU2Nzc4LCBhcGk6IDEyNy4wLjAuMSB9.Tm90IFNlY3VyZSE=
|  -------- payload ----------------------------| -- signature -|