如何确保url是从我的应用程序调用的,而不是从浏览器手动调用的
本文关键字:调用 浏览器 我的 何确保 确保 url 应用程序 | 更新日期: 2023-09-27 18:25:47
我有一个包含按钮的应用程序,单击该按钮,它将使用带有querystring参数的URL(我正在编码的页面的URL)打开浏览器窗口。
有没有办法确保URL来自我的应用程序,而且只来自我的程序,而不仅仅是任何人在网络浏览器中手动键入URL?
如果不是,什么是确保特定URL来自特定应用程序的最佳方法?而不仅仅是在地址栏或网络浏览器中手动输入?
我正在使用asp.net。
您可以使用检查请求是否来自应用程序的某个页面
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
如果请求的参数中不包含以前生成的随机一次性令牌(例如,该令牌将存储在会话中),那么除了拒绝请求之外,别无选择。
虽然没有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;
}
}