有些人发布信息的时候喜欢嵌套一些js
比如
<p onclick='action();'></p>
更有的是
<script ></script>等脚本直接放在里面
或者是
<script src='898.net'/>等等
这些东西存到数据库就会出问题啦。
要怎样做才好啊?分可以继续加。一个贴不够,我发两个。只要解决了问题就行我后台有一个清除js的脚本  /// <summary>清除字符串中的所有脚本代码</summary>
    /// <param name="text">输入的字符</param>
    /// <returns>字符串</returns>
    public static string ClearScript(this string text)
    {
        text = text.Trim();
        if (string.IsNullOrEmpty(text))
            return string.Empty;
        //替换 <script> 内所有内容
        text = Regex.Replace(text, "<[s|S][c|C][r|R][i|I][p|P][t|T](.|\n)*?[s|S][c|C][r|R][i|I][p|P][t|T]>", string.Empty);
        text = Regex.Replace(text, "<[s|S][c|C][r|R][i|I][p|P][t|T]>", string.Empty);
        text = Regex.Replace(text, "</[s|S][c|C][r|R][i|I][p|P][t|T]>", string.Empty);
        return text;
    }

解决方案 »

  1.   

    感觉只有像你那样用正则表达式过滤了,不过不用这么复杂了,正则表达式是可以忽略大小写的,查查Regex的参数吧。
    <script[^>]*>[\s\S]+</script>替换成string.Empty就可以对付所有的<script>了吧
    onclick="..."这个东西有点麻烦,简单写的话这样就好,
    on[^=]+=("[^"]*")|('[^']*')
    不过遇到转义就会出问题了。个人觉得如果你的主要目的是不让他的代码造成危害,这样过滤应该就足够了。
      

  2.   

    直接过滤掉不是太好吧,在存入数据库之前把html标签符号转换成字符串的,从数据库中读取显示的时候再转换回来就行。。
    /**
     * 转换html为str
     * 
     * @param str
     *            String
     * @return String
     */
    public static String justEncode(String str) {
    if (str != null) {
    str = str.trim();
    str = StringUtil.replace(str, "&", "&amp;");
    str = StringUtil.replace(str, "<", "&lt;");
    str = StringUtil.replace(str, ">", "&gt;");
    str = StringUtil.replace(str, "  ", "&nbsp;&nbsp;");
    str = StringUtil.replace(str, "\n", "<br>");
    str = StringUtil.replace(str, "\"", "&quot;");
    }
    return str;
    }
      

  3.   

    存入数据库就存原本来的
    读取的时候才html编码一下。
      

  4.   

    比较好的方法是存入数据库的时候把所有的<和>分别换成&lt;和&gt;。
    text = text.replace(/</g,"&lt;").replace(/>/g,"&gt;");
    这样就可以防止恶意脚本了。如果非得删除的话。
    text = text.replace(/<script\s.*?>.*?<\/script>/igm,"");
      

  5.   

    请问这个存入数据库就存原本来的 
    读取的时候才html编码一下。
    有什么用?就是以字符的形式输出来吗?
    <div></div>
    这样输出来可不太好吧。。
      

  6.   

    7楼的好像挺有道理。但不能去除onclick=东西
      

  7.   

    是编辑器的, 还是 textarea 的?textarea 的就不用过滤了,照 6# 说的, 用户输入什么就显示什么 输"<div>...</div>" 当然就原样显示 "<div>...</div>" 了如果是编辑器的,用户提交了带 script 的代码,属于恶意提交了.一般检测一下 存不存在 script 就是了
    存在的话,直接警告他! 不做其它业务操作
      

  8.   

    是编辑器..难道on什么事件的都检查出来就ok啦?
    有道理啊。
      

  9.   

    要去掉onclick一类的话就比较麻烦一点点,把所有要去掉的建一个数组,然后通过迭代一个一个去掉。(这里举例只列三个)
    var text = "<p onclick='abda' re>dsfwa</p>"
    var onEvents = ["onclick","onmouseover","onmouseout"];
    var i = 0;
    while(i < onEvents.length){
        regstr = "\\s+" + onEvents[i++] + "\\s*=.+?(>|\\s)";
        text = text.replace(eval("/"+regstr+"/"),"$1");
    }
      

  10.   


    string regex1 = @"(?i)<script\b";
    string regex2 = @"(?<=<[^<]+)\bon\w+\b(?=[^>]*>)";  // 不是绝对能把 on**** 给检测出来, 
    用这两正则分别检测一下.
      

  11.   


    string regex2 = @"(?i)(?<=<[^<]+)\bon\w+\b(?=[^>]*>)";  // 开忽略大小写模式
      

  12.   

    // 上面的 regex2 有问题的
    string regex2 = @"(?i)\bon\w+\b(?=[^<]+>)";