【问题标题】:How to prevent access to the web site from different ip with asp.net如何防止使用asp.net从不同的ip访问网站
【发布时间】:2020-01-03 02:06:21
【问题描述】:

我想创建一个安全层。例如:

User = John (Signed in) has a Session["ipadress"]
Hacker = Unknown (using same session_id) has a same Session["ipadress"] or new one? i need an information..

好吧,我想检查一个 IP 地址,如果它与注册和登录用户不同,而不是重定向到 sessioninactive.aspx 页面。

是否可以在 global.asax 中做?

【问题讨论】:

  • if it's different for registered and logged in user,如果注册用户的IP发生变化会怎样?
  • 一般情况下,用户在购物、使用应用程序或在线玩游戏时不会更改 IP 地址。不知何故,如果 IP 地址发生变化,我们可以为了用户的安全而结束会话,并且用户将需要再次登录。

标签: c# asp.net security session webforms


【解决方案1】:

这将在 Global.asax 中完成工作:

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        var ip = HttpContext.Current.Request.UserHostAddress;

        //TODO: handle correct list
        List<string> validIps = new List<string> { "::1" };

        if (!validIps.Contains(ip))
        {
            HttpContext.Current.Response.StatusCode = 403;
            HttpContext.Current.Response.StatusDescription = "Forbidden";
            HttpContext.Current.Response.End();
        }
    }

【讨论】:

    【解决方案2】:

    在 Global.asax 中添加以下方法

    在 Session_Start 上将 IP 保存到会话:

    protected void Session_Start()
    {
      string userIp = HttpContext.Current.Request.UserHostAddress;
      Session["ipadress"] = userIp;
    }
    

    在每个请求中,查看请求的 IP 是否与会话中保存的相同:

    protected void Application_AcquireRequestState()
    {
      string userIp = HttpContext.Current.Request.UserHostAddress;
    
      if (Session["ipadress"] != null)
      {
        string originalUserIp = Session["ipadress"].ToString();
        if (originalUserIp != userIp)
        {
          Response.Redirect("sessioninactive.aspx");
        }
      }
    }
    

    【讨论】:

    • 谢谢,我可以使用此代码获得一个 IP 地址,但如果可能的话,我计划在 Session_Start 上检查一个 IP 地址。假设我们知道用户在系统中并且有一个活跃的会话。不知何故,未知请求来自另一个 ip。我们可以想象有人知道这个用户的用户名和密码。或者会有一个通过 cookie 窃取的 session_id
    • 尝试更新的解决方案,应该可以解决问题。
    • 谢谢拉希德。我在 session_start 中设置了 IP 地址,但我没想到 Application_AcquireRequestState。我希望您的解决方案对其他人有所帮助。
    【解决方案3】:

    我会在我检查用户的地方这样做。例如在登录页面上。 你可以简单地做这样的事情:

    string sUserHostaddress = Request.UserHostAddress;
    

    然后您可以将您的 Seesion["ipaddress"](您可以以相同的方式填充该会话变量)与 sUserHostAddress 进行比较。

    不知道模仿 session_id 是什么意思?我不会依赖 cookie 来管理经过身份验证的状态。我认为重要的方面是您的登录是安全的。密码加密。我总是会根据实际使用的 SessionID 检查会话 cookie,如果它们不匹配,我会怀疑(可以编写代码来做一些事情)。

    如果用户使用在会话期间更改 IP 地址的代理,您可能会遇到问题。在我的日志文件中看到类似的内容。

    希望这会有所帮助。

    【讨论】:

    • 我在想 asp.net cookie 有 ASP.NET_Session_id。有人可以窃取并尝试使用它,或者如果有人知道目标用户的用户名和密码。试图在 session_start 上获取 IP 地址。所以,如果ip地址发生变化,就无法登录系统。因为我们在系统上有活动会话,对吗?只需要一点技巧就可以了。
    • 您可以控制 ASP.NET_Session_id 的生命周期。我通常使用 web.config 中的默认设置,即 20 分钟。非购物网站我做的时间更长。之后会话到期。需要新的登录。我还在 cookie 中设置了 SessionID(不是 ASP.Net 一个,而是一个附加的)。然后我也可以读取该 cookie 并与活动的 SessionID 进行比较。您可以为 cookie 指定任何名称,也可以对其进行加密。很难猜测它可能意味着什么。创建 cookie 时使用 HttpOnly = true。增加了另一层安全性。很高兴您对我的初步回答投了票。谢谢。
    • 感谢我已经使用 HttpOnly=true 作为默认的 asp.net cookie。只是考虑同时拒绝来自不同 IP 地址的登录,并且现在处于中间状态。我会评估您的其他建议。
    • 我猜你在 web.config 中也设置了 requireSSL="true" 。这将加密cookie。有趣的想法是同时登录多个。现在也需要考虑一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    相关资源
    最近更新 更多