停止在外部发布到 Asp.Net WebForm 页面的功能

本文关键字:WebForm Net 功能 Asp 外部 | 更新日期: 2023-09-27 18:31:47

在我们的系统中,我们使用 ASP.Net WebForms页面。

我们的系统中有一个自助注册网页,用户可以在其中注册以开始使用我们的系统。

我们最近发现,我们的一位客户正在从他们的网站向该页面发布表单数据,而该网站又在页面上提交表单。

我们希望阻止这种情况发生。我们不介意他们是否将页面嵌入到IFrame中,因为它无论如何都无法正常工作。但是我们需要阻止他们从他们的系统/网站将表单数据发布到该页面。

是否有我们可以设置的属性或停止外部发布到该页面的属性?或者也许是另一种选择,阿贾克斯似乎跳到了脑海中?

不知道要搜索什么,在网上快速搜索,但找不到任何东西。

想要阻止这种情况的原因:

当该页面上出现问题时,尝试注册的用户不会从我们的系统收到任何错误消息,因此我们得到了大量的支持。当然,我们可以添加功能来支持,但我们宁愿不这样做。还希望防止该页面上的机器人攻击,因为如果用户不存在,则每次提交都会创建一个用户。

停止在外部发布到 Asp.Net WebForm 页面的功能

从Visual Studio 2012开始,Microsoft向新的Web表单应用程序项目添加了内置的CSRF保护。若要使用此代码,请将新的 ASP .NET Web 窗体应用程序添加到解决方案中,并查看"Site.Master 代码隐藏"页。此解决方案将对从网站母版页继承的所有内容页应用 CSRF 保护。

必须满足以下要求才能使此解决方案正常工作:

所有进行数据修改的 Web 表单都必须使用"网站母版"页。所有进行数据修改的请求都必须使用视图状态。网站必须没有所有跨站点脚本 (XSS) 漏洞。有关详细信息Microsoft请参阅如何使用 .Net Web 保护库修复跨站点脚本 (XSS)。也看到了

   public partial class SiteMaster : MasterPage
   {
   private const string AntiXsrfTokenKey = "__AntiXsrfToken";
   private const string AntiXsrfUserNameKey = "__AntiXsrfUserName";
   private string _antiXsrfTokenValue;
 protected void Page_Init(object sender, EventArgs e)
 {
//First, check for the existence of the Anti-XSS cookie
var requestCookie = Request.Cookies[AntiXsrfTokenKey];
Guid requestCookieGuidValue;
//If the CSRF cookie is found, parse the token from the cookie.
//Then, set the global page variable and view state user
//key. The global variable will be used to validate that it matches in the view state form field in the Page.PreLoad
//method.
if (requestCookie != null
&& Guid.TryParse(requestCookie.Value, out requestCookieGuidValue))
{
    //Set the global token variable so the cookie value can be
    //validated against the value in the view state form field in
    //the Page.PreLoad method.
    _antiXsrfTokenValue = requestCookie.Value;
    //Set the view state user key, which will be validated by the
    //framework during each request
    Page.ViewStateUserKey = _antiXsrfTokenValue;
}
//If the CSRF cookie is not found, then this is a new session.
else
{
    //Generate a new Anti-XSRF token
    _antiXsrfTokenValue = Guid.NewGuid().ToString("N");
    //Set the view state user key, which will be validated by the
    //framework during each request
    Page.ViewStateUserKey = _antiXsrfTokenValue;
    //Create the non-persistent CSRF cookie
    var responseCookie = new HttpCookie(AntiXsrfTokenKey)
    {
        //Set the HttpOnly property to prevent the cookie from
        //being accessed by client side script
        HttpOnly = true,
        //Add the Anti-XSRF token to the cookie value
        Value = _antiXsrfTokenValue
    };
    //If we are using SSL, the cookie should be set to secure to
    //prevent it from being sent over HTTP connections
    if (FormsAuthentication.RequireSSL &&
    Request.IsSecureConnection)
    responseCookie.Secure = true;
    //Add the CSRF cookie to the response
    Response.Cookies.Set(responseCookie);
}
    Page.PreLoad += master_Page_PreLoad;
}
protected void master_Page_PreLoad(object sender, EventArgs e)
{
    //During the initial page load, add the Anti-XSRF token and user
    //name to the ViewState
    if (!IsPostBack)
    {
        //Set Anti-XSRF token
        ViewState[AntiXsrfTokenKey] = Page.ViewStateUserKey;
        //If a user name is assigned, set the user name
        ViewState[AntiXsrfUserNameKey] =
        Context.User.Identity.Name ?? String.Empty;
    }
    //During all subsequent post backs to the page, the token value from
    //the cookie should be validated against the token in the view state
    //form field. Additionally user name should be compared to the
    //authenticated users name
    else
    {
        //Validate the Anti-XSRF token
        if ((string)ViewState[AntiXsrfTokenKey] != _antiXsrfTokenValue
        || (string)ViewState[AntiXsrfUserNameKey] !=
        (Context.User.Identity.Name ?? String.Empty))
    {
    throw new InvalidOperationException("Validation of
    Anti-XSRF token failed.");
    }
}
}
}

滚动一些基本的东西并不难,您可以将 Guid 生成到隐藏字段中,然后检查您是否返回相同的 Guid,它不如 CAPTCHA 安全,但可以防止在不填写表单的情况下随机发布给您,但不会阻止实际填写表单并从页面发布的脚本。

<asp:Hidden ID="Validation" runat="server" />

页面加载:

var guid = Guid.NewGuid();
Validation.Text = guid.ToString();
Session["Token"] = guid;

然后在回发检查时,您会得到相同的返回...


或者,看看验证码NuGet包。它适用于网络表单和 MVC。

显示验证码:

<%@ Register Assembly="BotDetect" Namespace="BotDetect.Web.UI" 
  TagPrefix="BotDetect" %>
  […]
<BotDetect:Captcha ID="SampleCaptcha" runat="server" />
<asp:TextBox ID="CaptchaCodeTextBox" runat="server" />

验证帖子:

if (IsPostBack)
{
    // validate the Captcha to check we're not dealing with a bot
    bool isHuman = SampleCaptcha.Validate(CaptchaCodeTextBox.Text);
    CaptchaCodeTextBox.Text = null; // clear previous user input
    if (!isHuman)
    {
      // TODO: Captcha validation failed, show error message  
    }
    else
    {
      // TODO: Captcha validation passed, proceed with protected action  
    }
}

文档中的示例。