留言功能应该是每个动态网站都具备的功能,我想问问大家是用什么技术或者方法来实现的?直接在textarea输入?如果别人恶意地输入了JS脚本怎么办?如果用过滤的方法,一些懂HTML的人想用点个性代码怎么办?不可能<b>、<font>什么的都过滤了吧?另外如果是讨论编程的,更是一个代码也不能过滤。如果是在textarea上输入,大家怎么处理换行?有的人会用在线编辑器,但别人只是想说几句就要加载一个庞大的编辑器就太不应该了..而且在线编辑器的外观不好控制。总之,本人现在烦于处理这个小小的功能...想听听大家的意见。

解决方案 »

  1.   

    如果你想要功能强大的,
    要么用在线编辑器,要么自己写一个.如果你只想要一个简单的东西,
    你可以就用textarea就行了,
    对于你所说的安全问题过滤一下就即可,
    如果你还想给留言者一些自由又考虑安全问题,
    你可以只过滤javascript,这并不难实现
    至于你所说的换行问题,是很容易处理的,只要进度一次替换操作即可
    假如string内收到了你的textarea内的内容,只要用下面的代码就可以保留换行
    string.Replace("\n", "<br />"); 
      

  2.   

    用textarea就行了,再在后台对这些html替换,共享一个替换方法:
     public static string SqlInsertEncode(string strFromText)
        {
            if (!System.String.IsNullOrEmpty(strFromText) && strFromText != "")
            {
                //strFromText = strFromText.Replace(";", "&#59;");
                strFromText = strFromText.Replace("!", "&#33;");
                //strFromText = strFromText.Replace("@", "&#64;");
                strFromText = strFromText.Replace("$", "&#36;");
                strFromText = strFromText.Replace("*", "&#42;");
                strFromText = strFromText.Replace("(", "&#40;");
                strFromText = strFromText.Replace(")", "&#41;");
                strFromText = strFromText.Replace("-", "&#45;");
                strFromText = strFromText.Replace("+", "&#43;");
                //strFromText = strFromText.Replace("=", "&#61;");
                strFromText = strFromText.Replace("|", "&#124;");
                strFromText = strFromText.Replace("\\", "&#92;");
                //strFromText = strFromText.Replace("/", "&#47;");
                //strFromText = strFromText.Replace(":", "&#58;");
                strFromText = strFromText.Replace("\"", "&#34;");
                strFromText = strFromText.Replace("'", "&#39;");
                strFromText = strFromText.Replace("<", "&#60;");
                strFromText = strFromText.Replace(" ", "&#32;");
                strFromText = strFromText.Replace(">", "&#62;");
                strFromText = strFromText.Replace(" ", "&#32;");
            }
            return strFromText;
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            Response.Write(SqlInsertEncode(TextBox1.Text));
             //输入:<b><script>asdf<div>
             //输出:<b><script>asdf<div> 
        }
        
      

  3.   

    现在是要用简单的,所以选择了textarea,但要考虑安全问题,也不能过滤JS。如果是讨论编程的,别人发一句JS,想完整地显示出来,却被我过滤的不成样子,这说不过去。至于换行,也尝试过替换,但用的时候要把ValidateRequest设置为false才行,但这样子安全性反而就差了。郁闷...
      

  4.   

    如果打算像楼主所言,
    给用户一些自由,
    允许用户输入一些HTML的话2楼的代码是不行的,
    仅仅下面这两行代码就过滤了所有的HTML代码
    strFromText = strFromText.Replace("<", "&#60;");
    strFromText = strFromText.Replace(">", "&#62;");
      

  5.   


    麻烦你先试一下我的代码,html源代码&#60;在页面中显示出来就是<,其它也类似。。
      

  6.   

    的确,过滤了<>就把HTML都全打死了。先不讨论ValidateRequest,大家还有什么好的解决办法?
      

  7.   


    明白,但楼主是打算允许用户输入一些有个性的HTML代码
    你认为下面的字会显示红色吗?
    &#60;font color="red"&#62;红色字&#60;/font&#62;
      

  8.   


    晕,上面不是过滤<html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>无标题页</title>
    </head>
    <body>
        <form id="form1" runat="server">
            <asp:TextBox ID="TextBox1" runat="server" Width="298px" TextMode="multiLine"></asp:TextBox>
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
        </form>
    </body>
    </html>后台:
     public static string SqlInsertEncode(string strFromText)
        {
            if (!System.String.IsNullOrEmpty(strFromText) && strFromText != "")
            {
                //strFromText = strFromText.Replace(";", "&#59;");
                strFromText = strFromText.Replace("!", "&#33;");
                //strFromText = strFromText.Replace("@", "&#64;");
                strFromText = strFromText.Replace("$", "&#36;");
                strFromText = strFromText.Replace("*", "&#42;");
                strFromText = strFromText.Replace("(", "&#40;");
                strFromText = strFromText.Replace(")", "&#41;");
                strFromText = strFromText.Replace("-", "&#45;");
                strFromText = strFromText.Replace("+", "&#43;");
                //strFromText = strFromText.Replace("=", "&#61;");
                strFromText = strFromText.Replace("|", "&#124;");
                strFromText = strFromText.Replace("\\", "&#92;");
                //strFromText = strFromText.Replace("/", "&#47;");
                //strFromText = strFromText.Replace(":", "&#58;");
                strFromText = strFromText.Replace("\"", "&#34;");
                strFromText = strFromText.Replace("'", "&#39;");
                strFromText = strFromText.Replace("<", "&#60;");
                strFromText = strFromText.Replace(" ", "&#32;");
                strFromText = strFromText.Replace(">", "&#62;");
                strFromText = strFromText.Replace(" ", "&#32;");
                strFromText = strFromText.Replace("\n", "<br />");
            }
            return strFromText;
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            Response.Write(SqlInsertEncode(TextBox1.Text));
        }楼主你先在TextBox1中输入js脚本等试下看它的运行结果,你就知道了~
      

  9.   

    如果是像csdn这样的话就不行了,就要ubb了
      

  10.   

    用UBB的话又要引入一个庞大的编辑器了,这就是我最不希望的...
      

  11.   

    其实这个问题要解决并不难,
    写一段代码给你吧(代码未测试 如果有问题自己改一下)string strFromText = "你的相关字符";
    Regex re = new Regex@"<javascript[^>]*>[^<]*</script>",RegexOptions.IgnoreCase);//正则匹配javascript
    MatchCollection mc = re.Matches(strFromText);
    foreach (Match ma in mc)//循环,以便匹配所有javascript
    {
        string temStr=ma.Value;//如果匹配到将其付给变量
        string temNoHTML=temStr.Replace(" <", "&#60;");//将得到的内容过滤HTML后并付给另一变量
        temNoHTML=temStr.Replace(">", "&#62;"); //同上
        strFromText=strFromText.Replace(temStr,temNoHTML);//将这部分内容替换成过滤过的内容
    }
      

  12.   

    晕了,现在就看出问题了,漏了一个"("
    string strFromText = "你的相关字符";
    //之前下面这个地方漏了一个括号:(
    Regex re = new Regex(@"<javascript[^>]*>[^<]*</script>",RegexOptions.IgnoreCase);//正则匹配javascript
    MatchCollection mc = re.Matches(strFromText);
    foreach (Match ma in mc)//循环,以便匹配所有javascript
    {
        string temStr=ma.Value;//如果匹配到将其付给变量
        string temNoHTML=temStr.Replace(" <", "&#60;");//将得到的内容过滤HTML后并付给另一变量
        temNoHTML=temStr.Replace(">", "&#62;"); //同上
        strFromText=strFromText.Replace(temStr,temNoHTML);//将这部分内容替换成过滤过的内容
    }
      

  13.   

    ?是指输入<script>alert("test");</script>可以打开窗口?
      

  14.   

    gdjlc兄的代码经过测试基本满足要求,可以使代码完整显示,可以回车,唯一的缺点就是不能实现个性HTML,但还是非常不错。谢谢您
      

  15.   

    告诉你没有测试的,
    是我写错误了一点个地方你没注意吧string strFromText = "<javascript>fdsafda你的相关字符</script>";
    Regex re = new Regex(@"<javascript[^>]*>[^<]*</script>", RegexOptions.IgnoreCase);//正则匹javascript
    MatchCollection mc = re.Matches(strFromText);
    foreach (Match ma in mc)//循环,以便匹配所有javascript
    {
       string temStr = ma.Value;//如果匹配到将其付给变量
        string temNoHTML = temStr.Replace("<", "&#60;");//将得到的内容过滤HTML后并付给另一变量
        //注意下面的与之前写的比较一下你应该明白了.
        temNoHTML = temNoHTML.Replace(">", "&#62;"); //同上
        strFromText = strFromText.Replace(temStr, temNoHTML);//将这部分内容替换成过滤过的内容
    }
    用这试试吧,只过滤javascript代码,HTML代码不过滤
      

  16.   

    上面的代码只过滤Javascript代码,不过滤HTML代码
    例如:
    <font color="red"><javascript>fdsafda你的相关字符</script></font><javascript gfds gfd>fdsafda你的相关字符</script>
    将过滤成
    <font color="red">&#60;javascript&#62;fdsafda你的相关字符&#60;/script&#62;</font>&#60;javascript gfds gfd&#62;fdsafda你的相关字符&#60;/script&#62;
      

  17.   

    我用来测试的是
    <font color="red">aaaa</font><script language="javascript">alert("fdsafda你的相关字符") </script> <javascript gfds gfd>fdsafda你的相关字符 </script> <script>alert("aaa")</script>
    aaaa <javascript gfds gfd>fdsafda你的相关字符 </script>
    然后连续两次弹出消息。差不多了,明白了思路。
      

  18.   

    不过滤HTML代码 ,这样子的话也不太好吧,万一有故意搞乱的人,输入了<div style="1000px">a</div>之类的代码整个页面的布局就乱套了
      

  19.   

    呵呵,
    你自己慢慢研究吧,
    我现在正在写Form程序,刚才也只是在Form环境下测试了一下代码.
    现在我要继续写程序了,没有太多时间给你回复了,
    如果你能明白给你写的代码的思路,
    我想你应该能自己解决问题的.
    上面代码的思路是
    一、先匹配所有<javascript>.....</script>
    二、将这些内容保存到一个变量
    三、将这些内容进行替换操作
    四、将原字符内的相关字符换成之前改过的内容到此结束,我要工作了
    祝你好运!
      

  20.   

    encode,decode把所有敏感字符,比如<,>替换掉
      

  21.   

    换行是string.Replace("\n\r", " <br />"); 
      

  22.   

    FreeTextBox文本编辑器
    直接绑定就行了
    那么费劲干什么
      

  23.   


    Response.Write(Server.HtmlEncode("<script>alert('');</script>"));
    Response.Write("<script>alert('');</script>");&lt;script&gt;alert('');&lt;/script&gt;<script>alert('');</script>