如何知道网站是不是被 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 请求?