在服务器上,是否有任何方式的内部和外部的REST API请求之间进行区分?
为什么?
我想区分两个来源,究其原因是因为我可以,根据该意见,受访者给出的,想返回不同的数据集,这取决于谁是试图发出请求。
摘要
我的内部定义可能不正确。在这种情况下,“内部”是指从来自同一域的页面处理请求的请求XHTTP做出的请求。
外部呼叫可能创造另一个域上卷翘请求的用户。
例如:
http.service.ts
内部ANGULAR 6 REQUEST
fetchLogin(formData: any): Observable<any> {
let req = null;
let headers = null;
headers = {
reportProgress: false,
headers: new HttpHeaders({
'email': formData['email'],
'password': formData['password']
})
};
req = new HttpRequest('POST', this.restApiUrl + this.restApiUrlEndpoint + '/oauth/', '', headers);
return this.http.request(req)
.map( (data) => {
return 'body' in data ? data['body'] : null;
})
.pipe(
catchError(this.handleError)
);
}
template.cfm
外部COLDFUSION REQUEST
<cfset httpUrl = request.restApiUrl & request.restApiUrlEndpoint & "/oauth/">
<cfhttp url="#httpUrl#" method="post" result="result" timeout="30">
<cfhttpparam type="header" name="email" value="[email protected]" />
<cfhttpparam type="header" name="password" value="foo" />
</cfhttp>
请您理解,我已经简化这两个代码片段让事情变得清晰。
当请求到达服务器,我怎么能知道哪些请求通过XHTTP来,已通过CFHTTP [卷曲]已发送?
我使用Taffy.io REST API框架,所以这里是一个简单的方法,一个“资源” CFC里面,我可能会用它来处理请求:
资源/ oauthMember.cfc
<cfcomponent extends="taffy.core.resource" taffy_uri="/oauth">
<cffunction name="post">
<cfset var local = StructNew()>
<cfset local.data['email'] = "">
<cfset local.data['password'] = "">
<cfset local.requestBody = getHttpRequestData().headers>
<cftry>
<cfset local.data['email'] = Trim(local.requestBody['email'])>
<cfset local.data['password'] = Trim(local.requestBody['password'])>
<cfcatch>
</cfcatch>
</cftry>
...processing code
<cfreturn representationOf(local.data) />
</cffunction>
</cfcomponent>
添加一个额外的头其中一个呼叫是不可行的,因为这很容易被欺骗。
有任何想法吗?
环境
的Windows 2008R2 Lucee 4.5 IIS7 +
总之,你不能进来公共REST API数据请求相信任何东西了。在请求内容的任何/标头可通过卷曲或定制程序来constucted。你,或许,可能有插座的源IP地址一定程度的信任,如果你的Web服务器相应的配置,并且具有从插座本身到源极连接地址直接访问。这是罕见的情况下,如今,作为一般的Web服务器现在位于负载平衡器后面,NAT防火墙隧道等,但即使在这种情况下,源IP地址可能只可用于某种白名单。此外,今天有这种访问的服务器,可能会失去它的明天,当你的应用程序可能需要负载均衡规模。还要注意的是,用户可以有一个源路径上的HTTP代理。因此,使用的源IP作为API的标准看起来不好的做法。
良好的做法是创建公共API,它是不变的调用者。 API调用应集中在REST请求主体和提供检查他们的有效性,可接受性和安全性头。 > sessionToken - - >“API与sessionToken称之为” - 事实上,许多API调用应该像“登陆”顺序进行>“注销与sessionToken”(令牌无效)。在这种情况下,重要的数据存储在连接到sessionToken莫名其妙服务器(用户ID,角色,安全上下文等)。注:很多API建筑师不建议存放在sessionToken饼干,因为它可以简化CSRF攻击(如果没有其他措施提供)。
你和可能很多人要的是有“私人” API来实现你的网站功能本身和“公共”的API给客户。这是一个有点不同的故事。
公共API您记录,发布(至少对客户),承诺在较长时间内保持不变。
私人API,你可以在任何时刻发生变化,你可能的方式,是舒适的你设计的。但是,如果你的网站是活的,任何人都可以仍然扫描自己的流量和构建具有卷曲(或东西一样)类似的请求。你可以,但是,做一些技巧来取得施虐者的日子越来越难过,像发行某种JavaScript的计算网页的令牌,用短暂的请求链等,但是这并没有完全消除威胁。所以API不能中继上,“没有人可以构建这样的要求”如果要求所有的数据可以从页面和流量由合法用户来获得。
简历:最好有客户和私人API,以网站本身的公共API和不混合。