请考虑以下场景:
我有一个 API 运行在与 IIS 相同的服务器上。IIS 托管一个网页。我想仅允许此网页访问 API。域内的其他页面均不允许访问。
假设域名是 example.com,网页是 example.com/page。example.com、example.com/other 都不能访问。只有 example.com/page 才可以访问。
作为奖励,我想知道我是否可以阻止直接访问 API。所以我想禁止转到 URL 栏并使用 API 地址发出获取请求。
答案1
我想仅允许访问此网页的 API。不允许访问域内的其他页面。
您所描述的最好在 api 端实现为 HTTP Referer [sic] 白名单。Http Referer 标头描述了引用站点,浏览器将默认添加它 - 但请注意,标头是由客户端提供的,因此虽然这会阻止天真的网络用户从不同的站点访问您的 API,但如果用户自己有动机从站点访问 api,他们可以轻易伪造 http Referer 标头。
保护 API 免遭非法使用的唯一真正方法是向 API 服务器提供身份验证和授权。即便如此,任何获得授权的人都会在带有伪造的 http 标头的 API 调用中提供相同的凭据。因此,归根结底,您无法真正阻止有动机的一方在不使用站点的情况下访问 API。不过,如今的网站通常不会担心这一点 - 他们专注于确保使用 CORS 来防止对不知情用户的跨站点脚本攻击,并专注于身份验证和授权以阻止恶意行为者,这些恶意行为者会简单地伪造客户端提供的任何东西。
作为奖励,我想知道我是否可以阻止直接访问 API。所以我想禁止转到 URL 栏并使用 API 地址发出获取请求。
将某些引荐来源列入白名单应该可以实现这一点。直接输入 URL 的链接不提供引荐来源,因此不符合您的白名单。您实际上并没有阻止使用权对于 api,它需要从您网站合法用户的任意 IP 进行访问,但您正在通过检查 referer 并拒绝不符合您的白名单的请求来进行简单的授权检查。