【问题标题】:How should I handle users browsing to pages in my site meant only for AJAX? Should I ever use GET?我应该如何处理浏览我网站中仅用于 AJAX 的页面的用户?我应该使用 GET 吗?
【发布时间】:2013-05-10 14:30:30
【问题描述】:

关于在 AJAX 请求中何时使用 POST 和何时使用 GET 的性质,有人提出了类似的问题

这里: What are the advantages of using a GET request over a POST request?

在这里: GET vs. POST ajax requests: When and how to use either?

但是,我想明确指出,这并不是我要问的。我得到幂等性、敏感数据、浏览器能够在发生错误时重试的能力,以及浏览器能够缓存查询字符串数据的能力。

我的真实情况是,我想阻止我的用户简单地输入我的“Compute.cshtml”文件的 URL(即我的 jQuery $.ajax 函数发布到的服务器上的文件)。

我在 WebMatrix C#.net 网页环境中,我尝试在文件名前加上下划线 (_),但显然 AJAX 请求与该下划线旨在防止的标准相同的显示当然会中断请求。

所以如果我使用 POST,我可以简单地使用这个逻辑:

if (!IsPost)  //if this is not a post...
{
    Response.Redirect("~/") //...redirect back to home page.
}

如果我使用 GET,我想我可以发送附加数据,例如包含值 "AccessGranted" 的字符串,并在另一端检查它是否等于该值,如果不等于则重定向,但这可以通过以下方式轻松复制在地址栏中输入(不是说数据在另一边是敏感的,但是...)。

无论如何,我想我想问是否可以始终使用 POST 来处理此逻辑,或者在 WebMatrix C#.net 网页中使用 GET 或 POST 和 AJAX 处理我的情况的适当方法是什么环境。

【问题讨论】:

    标签: c# ajax post get webmatrix


    【解决方案1】:

    我的建议是,不要试图阻止他们。它是无害的。

    • 您没有直接链接到它,所以它不会真正出现。 (为了 Google 的缘故,您可能希望您的 robots.txt 排除整个 /api 目录)。
    • 这是他们无论如何都可以访问的数据(否则您需要服务器端修剪),因此您不能暴露任何危险或敏感的内容。
    • 将 GET 用于类似 GET 的请求的优势很多,正如您所链接的(缓存、语义等)

    那么通过直接浏览器输入访问该 url 有什么害处?如果他们足够狡猾,他们也可以直接 POST,例如使用 Fiddler “compose”。并且让 GET 可以通过 url 访问对于调试很有用。

    编辑:请参阅http://www.robotstxt.org/orig.html 之类的网站了解更多详细信息,但从名为 /api 的 Web 服务目录中排除搜索引擎的 robots.txt 如下所示:

    User-agent: *
    Disallow: /api/
    

    【讨论】:

    • 好吧,我想我只是觉得这里“格格不入”,并且不确定是否已经有一个易于使用的预定义函数或方法用于这类事情。因此,如果他们浏览到此页面并显示一个带有一长串串联值的空白屏幕,那么他们就不应该这样做。感谢您的回答,我不太确定此类事情的最佳做法是什么:)
    • 我要走了,再过8分钟我就不接受了,等我回来就接受了。感谢您的快速回答!
    • 哦,还有一件事。我绝对会喜欢如何在 robots.txt 文件中包含上述排除项的示例。我以前从未这样做过。
    • 已添加。此外,您可以看到其他答案,这些答案提供了一些阻止它的可能性,并且它们有时会起作用。但是IMO,它无缘无故地增加了复杂性。有很多网络服务接受网络上的直接浏览器 GET,比如我最喜欢的:data.mtgox.com/api/2/BTCUSD/money/ticker
    • 很抱歉问了这么多问题,但是当您说“名为 /api 的 Web 服务目录”时,您的意思是说,我的站点根目录中有一个名为“AJAX 页面”的目录我在 robots.txt 文件中的内容是:User-agent: *,在第二行:Disallow: AJAX Pages/?我说对了吗?
    【解决方案2】:

    IsPost类似,在大多数浏览器中可以使用IsAjax判断请求是否由XmlHttpRequest对象发起。

    if(!IsAjax){
       Response.Redirect("~/WhatDoYouThinkYoureDoing.cshtml");
    } 
    

    它检查请求以查看它是否具有值为XmlHttpRequestX-Requested-With 标头,或者请求对象中是否存在具有键X-Requested-With 的值为XmlHttpRequest 的项。

    【讨论】:

    • 真的吗?我知道这种方法,但是,我已经明确尝试过,但它根本不起作用(我使用的是 GET)。它仅适用于 POST 吗?无论哪种方式,我都会再试一次,让你知道。
    • 太棒了 :) 现在它正在工作(至少在 POST 中)。这是一个很好的例子,说明我如何亲自测试代码以了解它是如何工作的(尤其是当我不完全理解文档时)可能会给自己带来问题......
    • 我能想到的唯一另一件事与我之前测试时的不同之处在于,我使用的是直接的 JavaScript(你知道,整个 loadXMLDoc 函数),但现在我尝试只使用 jQuery 的 $.ajax 函数(我发现它要好得多) 我只是喜欢 jQuery 为我处理许多兼容性问题的方式(例如 .css("opacity", "0.5"),这使我无法编写第二次调用 `filter(alpha:不透明度)对于 IE)
    • 好的,我用 GET 对其进行了测试,似乎 IsAjax 方法不适用于 GET。这就是为什么它以前不适用于我的测试。因此,如果我使用IsAjax,它必须是 POST(更不用说他们鲜为人知的表亲 PUT 和 DELETE,我什至不会试图炒作我的大脑试图询问)
    • OHHHH 等等,我错了。看来它确实适用于 GET(我正在测试一个使用 Request.Form 的变量显然与 GET 不兼容)。 IsAjax 不能与 JavaScript 的旧 loadXMLDoc 函数一起使用吗?
    【解决方案3】:

    检测直接 AJAX 调用的一种方法是检查 http_referer 标头是否存在。直接键入的 URL 不会生成引荐来源网址,但您仍然无法将调用与简单的锚链接区分开来。

    (请记住,某些浏览器不会为 XHR 请求生成标头。)

    【讨论】:

    • 您能否举例说明如何检测直接 AJAX 调用?
    猜你喜欢
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多