我有一个包含按钮的应用程序,单击此按钮,它将使用带有查询字符串参数的URL(我正在编码的页面的URL)打开浏览器窗口。
有没有办法确保网址来自我的应用程序,而且只来自我的应用程序 - 而不仅仅是在网络浏览器中手动输入网址的任何人?
如果没有,确保特定网址来自特定应用程序的最佳方法是什么 - 而不仅仅是手动输入地址栏或网络浏览器 -
我正在使用asp.net。
答案 0 :(得分:3)
您可以使用以下方式检查请求是否来自您的应用程序的其中一个页面:
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
答案 1 :(得分:1)
没有可靠的方法为GET请求执行此操作,也没有任何理由尝试合法用户。您应该做的是确保无论请求来自何处,用户都具有适当的权限和访问权限,并且会话受到适当保护(仅限HTTP,SSL等)如果请求正在更改数据,那么应该是POST,而不是GET,它应该伴随着一些合适的跨站点请求防伪技术(例如包含nonce的cookie,该cookie会根据表单上的匹配nonce进行验证)。
答案 2 :(得分:0)
除了拒绝请求之外,如果它不包含参数中的先前生成的随机一次性令牌(例如,会存储在会话中),则无法拒绝。
答案 3 :(得分:0)
虽然没有100%安全的方法来做到这一点,但我所建议的可能至少可以满足您的基本需求。
这是你可以做的。
客户端:添加一个带有编码字符串的HTTP标头,该字符串类似于某个单词的hash(sha256)。 然后让您的客户端始终执行POST请求而不是GET。 服务器:检查HTTP标头是否有编码字符串。还要确保它是POST请求。
这不是100%,因为某人足够智能可以弄清楚并仍然生成请求,但根据您的需要,您可能会发现这一点或不充分
答案 4 :(得分:0)
您可以检查引用者,用户代理,向请求添加其他标头,始终对该URL发布请求。但是,考虑到HTTP是以纯文本形式传输的,有人总是能够让wireshark或fiddler运行,捕获HTTP数据包并使用您的措施重新创建请求。
答案 5 :(得分:0)
从您的应用程序传递参数,以便您可以在服务器端进行验证。
我建议您使用加密算法并使用密码(密钥)生成随机文本。然后,解密服务器端的参数并检查它是否符合您的期望。
但是,我不是很清楚。对不起,如果不得不做这样的事情,那么,我会做类似于上面提到的事情。答案 6 :(得分:0)
如果它来自于angularjs或jquery中的代码,您可以使用检查MVC控制器上的标头,如Request.Headers["Accept"];
:
示例angularjs如下:
var url = ServiceServerPath + urlSearchService + '/SearchCustomer?input=' + $scope.strInput;
$http({
method: 'GET',
url: url,
headers: {
'Content-Type': 'application/json'
},.....
关于MVC [HttpGet]动作方法
[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;
}
}