如何知道网站是不是被 AJAX 请求访问

Posted

技术标签:

【中文标题】如何知道网站是不是被 AJAX 请求访问【英文标题】:How to know if site is being accessed with AJAX request如何知道网站是否被 AJAX 请求访问 【发布时间】:2012-04-15 17:36:33 【问题描述】:

所以,我有一个用于我的***站点的 API,我将它提供给我的用户放在他们的页面上。

API:

<script type="text/javascript">

 var id = 21;

 $(document).ready(function()
      $.getJSON("http://topsite.com/index.php?page=vote",  id: id, hasVoted: 'unknown' , function(data) 
           if(data == 2) 
                window.location.replace("http://topsite.com/index.php?page=vote&id=" + id);
           
      );
 );

所以,基本上我想要做的是避免我的客户将此代码放在他们的网站上:

<script type="text/javascript">$.getJSON("http://topsite.com/index.php?page=vote&id=21");</script>

因为我希望用户被重定向到我的网站,这样我就可以从广告中赚取一些钱,甚至向他们展示一些信息。

所以,我想知道是否有任何方法可以知道何时使用 ajax 请求访问网站,或者如果设置了 hasVoted 参数,是否有方法禁用 AJAX 请求。

感谢任何帮助,谢谢!

编辑:从带有“hasVoted”参数的站点重定向到其他页面时,我将发送自定义标头。

编辑问题:我将如何继续发送带有位置的自定义标头?还是我离这儿很远?

【问题讨论】:

【参考方案1】:

非正式地,许多 AJAX 库添加了一个名为 X-Requested-With 的自定义 HTTP 标头并将值设置为 XMLHttpRequest。您可以检查该标头并查看它是否设置为该值,在这种情况下,一个很好的假设是它是一个 AJAX 请求。

但是,没有标准,如果你直接构建一个 XMLHttpRequest(即,实现你自己的 AJAX 代码),那么没有真正的方法来判断。

【讨论】:

我实际上正在考虑在设置“hasVoted”参数时发送自定义 HTTP 标头。然后在另一个页面上检查它是否已设置,这行得通吗? 那行得通。已经为其他目的完成了(如果请求由特定的 ajax 请求发出,则发送不同的模板) 但请注意,即使这也是伪造的.. 如果有人查看 hasVoted 请求或查看标题.. 然后他可以添加它。我认为如果有人真的想伪造身份来获取您的数据,您将很难避免它。 我明白了。好吧,我宁愿让任何想要这样做的人都很难。顺便说一句,我将如何继续发送带有位置的自定义标头?还是我离这儿很远?问题已添加到主帖。 可能(或不)感兴趣:***.com/questions/3759575/…【参考方案2】:

首先,ajax 请求不会像那样跨域工作。该代码不适用于除 topsite.com 及其子域之外的任何网站。

但是,没有什么可以阻止任何人通过服务器端脚本解析内容。并且没有可能完全阻止人们下载它(你可以让它变得困难,但只要它是公开的,人们就可以下载它)

【讨论】:

@Manuel, jsfiddle.net/HSWTJ 它向我抛出一个错误,说由于跨域策略问题而无法访问该域。 topsite.com 是一个虚拟域,而不是我的网站,因为我不需要发布该域。 它甚至没有提出请求......实际的域是无关紧要的。 domainx.com 无法对 domainy.com 进行 ajax 调用。正如我、Eli 和 NiftyDude 所指出的,它被所有现代浏览器使用的同源策略锁定。 请启发我,然后有 50 多个网站正在使用该 API,并且一切都运行良好。 其实这50个站点都包含一个脚本,但是并没有让用户的浏览器发出http请求,不是吗?【参考方案3】:

也许通过检查用户代理?

【讨论】:

如果你做类似的事情(这很糟糕......)在你的页面中有效地获取数据,比如在 DOM-ready 的 ajax 请求或什么的? getJSON 不执行 client-JS 对吗?

以上是关于如何知道网站是不是被 AJAX 请求访问的主要内容,如果未能解决你的问题,请参考以下文章

我如何知道 jQuery 是不是有待处理的 Ajax 请求?

ajax --- Ajax跨域请求保证同一个session的问题

什么叫ajax跨域访问

CSRF(跨域请求伪造)

几种常用的ajax 跨域请求

JSAJAX跨域