【问题标题】:how apply Server.HtmlEncode for every TextBox in a page如何为页面中的每个 TextBox 应用 Server.HtmlEncode
【发布时间】:2011-05-16 01:32:44
【问题描述】:

我在一个页面中有很多 TextBox。

我想知道是否有办法以编程方式检查此 TextBox 的所有输入和

Server.HtmlEncode 应用于每个人。

所以我不需要为每个字符串都应用 Server.HtmlEncode。

谢谢!

【问题讨论】:

  • 你到底想达到什么目标?
  • 我希望避免用户向我的网络应用程序插入恶意脚本
  • ^^ 那么这是否意味着在编码后您希望将所有文本框文本添加到集合或其他内容中?
  • ^^ 检查我的答案以获取示例 sn-p..

标签: c# asp.net


【解决方案1】:

您需要为此创建一个实用程序方法。大概是这样的:

如果不存在嵌套文本控件,则为简单版本:

public Dictionary<string, string> ReturnsAllTextEnteredOnPage()
{
   Dictionary<string, string> allTextEnteredOnPage = new Dictionary<string, string>(); 
   foreach (var control in Page.Controls)
   {
      if (control is TextBox)
      {
         TextBox ctrl = (TextBox)control;
         allTextEnteredOnPage.Add(ctrl.ID, Server.HtmlEncode(ctrl.Text));
      }
   }
   return allTextEnteredOnPage;
}

考虑页面上所有文本框的有点复杂的版本:

public Dictionary<string, string> ReturnsAllTextEnteredOnPage()
{
  Dictionary<string, string> allTextEnteredOnPage = new Dictionary<string, string>(); 
  var allControls = FlattenChildren(Page);
  var allTextControls = allControls.OfType<TextBox>();
  foreach(var textCtrl in allTextControls)
  {
     allTextEnteredOnPage.Add(textCtrl.ID, Server.HtmlEncode(textCtrl.Text));
  }
  return allTextEnteredOnPage;        
}

上面的方法使用了一个叫FlattenChildren的方法,可以取自here

其次,我没有使用编辑器来输入该代码..

【讨论】:

  • 你能提供任何例子吗?
  • 谢谢你的课看起来不错,我没有给你任何downvote!感谢您的帮助!
  • ^^ 感谢您接受我的回答,希望对您有所帮助。
【解决方案2】:

一种方法是继承TextBox 控件并覆盖Text 属性以简单地返回一个HTML 编码的字符串。然后,您可以在需要对字符串进行 HTML 编码的项目中使用该控件。

或者,您可以为所有 TextBox 对象声明一个扩展方法,该方法将返回字符串的 HTML 编码版本,您可以在整个项目中简单地调用该扩展方法,而不是引用 .Text 属性:

编辑:添加扩展方法帮助代码示例

class TextBoxHelper{ public static string GetHtmlEncodedString(this System.Web.UI.WebControls.TextBox textbox){ return Server.HtmlEncode(textbox.Text); } }

【讨论】:

    【解决方案3】:

    对输入进行编码是否有特殊原因?

    通常您会对输出进行 Html 编码,即在显示数据时。

    编辑:

    如果您想强化您的应用以抵御 XSS 和 SQL 注入攻击,您可能需要查看 Microsoft Web Protection Library

    【讨论】:

      【解决方案4】:

      这里的问题是,如果您更改控件的值,则可能会导致用户混淆(即,这不是我输入的内容)。因此,您可以做的是创建一个经过清理的输入集合并在您的应用程序中使用它,如下所示:

      protected void Page_Load(object sender, EventArgs e)
      {
          Dictionary<string, string> values = new Dictionary<string, string>();
          if (this.IsPostBack)
          {
              foreach (var control in this.Controls)
              {
                   TextBox textbox = control as TextBox;
                   if (textbox != null)
                   {
                       values.Add(textbox.ID, Server.HtmlEncode(textbox.Text));
                   }
              }        
          }
      }
      

      上面的值将包含经过处理的输入。我还建议在这种情况下查看Anti-XSS library 以获得额外的保护。

      【讨论】:

      • 我不相信,一个简单的 foreach 会得到每个文本框 - 也可以考虑嵌套的!
      猜你喜欢
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 2021-07-18
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      相关资源
      最近更新 更多