如何确保url是从我的应用程序调用的,而不是从浏览器手动调用的

本文关键字:调用 浏览器 我的 何确保 确保 url 应用程序 | 更新日期: 2023-09-27 18:25:47

我有一个包含按钮的应用程序,单击该按钮,它将使用带有querystring参数的URL(我正在编码的页面的URL)打开浏览器窗口。

有没有办法确保URL来自我的应用程序,而且只来自我的程序,而不仅仅是任何人在网络浏览器中手动键入URL?

如果不是,什么是确保特定URL来自特定应用程序的最佳方法?而不仅仅是在地址栏或网络浏览器中手动输入?

我正在使用asp.net。

如何确保url是从我的应用程序调用的,而不是从浏览器手动调用的

您可以使用检查请求是否来自应用程序的某个页面

Request.UrlReferrer.Contains("mywebsite.com")

这就是简单的方法。

安全的方法是在客户端上放置一个cookie,其中包含使用安全密钥加密或使用安全盐散列的值。如果cookie被设置为在页面关闭时过期,那么就不可能有人伪造。

这里有一个例子:

在将重定向到您试图保护的页面的页面上:

  HttpCookie cookie = new HttpCookie("SecureCheck");
  //don't set the cookie's expiration so it's deleted when the browser is closed
  cookie.Value = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(Session.SessionID, "SHA1");
  Response.Cookies.Add(cookie);

在您试图保护的页面上:

  //check to see if the cookie is there and it has the correct value
  if (string.IsNullOrEmpty(Request.Cookies["SecureCheck"]) || System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(Session.SessionID, "SHA1") != Request.Cookies["SecureCheck"])
    throw Exception("Invalid request. Please access this page only from the application.");
  //if we got this far the exception was not thrown and we are safe to continue
  //insert whatever code here
对于GET请求,没有可靠的方法可以做到这一点,他们也没有任何理由尝试合法用户。相反,您应该确保无论请求来自何处,用户都具有适当的权限和访问权限,并且会话受到适当的保护(仅HTTP cookie、SSL等)。如果请求正在更改数据,那么它应该是POST,而不是GET,并且它应该伴随一些合适的跨站点请求伪造防止技术(例如,包含随机数的cookie,该随机数是根据表单本身上的匹配随机数进行验证的)。

如果请求的参数中不包含以前生成的随机一次性令牌(例如,该令牌将存储在会话中),那么除了拒绝请求之外,别无选择。

虽然没有100%安全的方法来做到这一点,但我的建议至少可以满足您的基本需求。

这就是你能做的。

客户端:添加一个带有编码字符串的HTTP标头,该字符串类似于某个单词的hash(sha256)。然后让您的客户端始终执行POST请求,而不是GET。服务器:检查HTTP标头中的编码字符串。还要确保这是POST请求。

这并不是100%,因为当然,足够聪明的人可以找到并仍然生成请求,但根据您的需要,您可能会发现这已经足够了,或者

您可以检查referer、用户代理,向请求添加额外的头,并始终将请求发布到该url。然而,考虑到HTTP是以纯文本传输的,总有人能够让wireshark或fiddler运行,捕获HTTP数据包,并在适当的措施下重新创建请求。

从应用程序传递参数,以便在服务器端进行验证。

我建议您使用加密算法,并使用密码(密钥)生成随机文本。然后,在服务器端解密参数,并检查它是否符合您的期望。

不过我不太清楚。很抱歉,如果必须做这样的事情,那么,我会做类似于上面提到的事情。

如果标题来自angularjs或jquery:中的代码,您可以使用来检查像Request.Headers["Accept"];这样的MVC控制器上的标题

样本angularjs如下:

var url = ServiceServerPath + urlSearchService + '/SearchCustomer?input=' + $scope.strInput;
$http({
            method: 'GET',
            url: url,
            headers: {
                'Content-Type': 'application/json'
            },.....

以及MVC〔HttpGet〕Action方法

        [HttpGet]
        [PreventDirectAccess]//It is my custom filters
        // ---> /Index/SearchCustomer?input={input}/
        public string SearchCustomer(string input)
        {
            try
            {
                var isJsonRequestOnMVC = Request.Headers["Accept"];//TODO: This will check if the request comes from MVC else comes from Browser
                if (!isJsonRequestOnMVC.Contains("application/json")) return "Error Request on server!";
                var serialize = new JavaScriptSerializer();
                ISearch customer = new SearchCustomer();
                IEnumerable<ContactInfoResult> returnSearch = customer.GetCustomerDynamic(input);
                return serialize.Serialize(returnSearch);
            }
            catch (Exception err)
            {
                throw;
            }
        }