我上网查了一些了已经,但是得到的只是不全面不系统。(google上搜了“屏蔽替换字符”“特殊字符”“Html字符过滤”)因为我想要存Html的全部格式,也许里面还有一些变成的源代码在里面就想这里的贴出来的代码一样。
所以我想问:
1。希望有高手能给系统的讲一下,如果不屏蔽或者替换这些会在哪些方面产生安全隐患?
2。具体需要替换或者屏蔽文本框中提交的哪些字符?或者替换成什么?替换后会影响格式吗?
3。c#中的Server.HtmlEncode和HtmlDecode在这方面能发挥什么作用么?希望高人能系统的指点一下后人,我想肯定很多刚接触这方面的朋友也想看到您的回复。

解决方案 »

  1.   

    防范sql注入
    其他地方Server.HtmlEncode就好了,方便快捷
      

  2.   

    谢谢绑定的兄弟。
    另外Server.HtmlEncode转换'字符么?我刚才是了一下好象没有转换这个,造成我插入数据库失败。如果这个'不需要转换,请指点我。
    我的select语句如下
    string strSql = "insert into Mydb(col1,col2,col3) values('"+this.tbName.Text+"','"+Server.HtmlEncode(this.tbContent.Text)+"','"+this.tbTitle.Text+"')";
      

  3.   

    天啊这么写代码肯定不行。这个是课本的用法。SqlParameter 参数才行啊。自己找找SqlParameter的资料
      

  4.   

    参数执行,可避免SQL注入攻击.
    sql字符串中不要用this.tbName.Text,最起码也要进行一下为空或其它验证吧
      

  5.   

    str.Replace("<","<").Replace(">",">").Replace("'","‘").Replace("\"","“");
    另:用存储过程写入数据库
      

  6.   

    天啊,我到底应该听谁的。综合上面几位高手的指点,我产生了如下理解:
    1。必须使用存储过程来减小安全风险;
    2。将部分特殊字符转换——用Server.HtmlEncode还是什么方面各有说法,到底转化哪些字符还需有人点破沃阿。
      

  7.   

    ⑴ 对于动态构造SQL查询的场合,可以使用下面的技术:   第一:替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义。再来看前面的例子,“SELECT * from Users WHERE login = ''' or ''1''=''1' AND password = ''' or ''1''=''1'”显然会得到与“SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'”不同的结果。   第二:删除用户输入内容中的所有连字符,防止攻击者构造出类如“SELECT * from Users WHERE login = 'mas' -- AND password =''”之类的查询,因为这类查询的后半部分已经被注释掉,不再有效,攻击者只要知道一个合法的用户登录名称,根本不需要知道用户的密码就可以顺利获得访问权限。   第三:对于用来执行查询的数据库帐户,限制其权限。用不同的用户帐户执行查询、插入、更新、删除操作。由于隔离了不同帐户可执行的操作,因而也就防止了原本用于执行SELECT命令的地方却被用于执行INSERT、UPDATE或DELETE命令。   ⑵ 用存储过程来执行所有的查询。SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击。此外,它还使得数据库权限可以限制到只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式攻击了。   ⑶ 限制表单或查询字符串输入的长度。如果用户的登录名字最多只有10个字符,那么不要认可表单中输入的10个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度。   ⑷ 检查用户输入的合法性,确信输入的内容只包含合法的数据。数据检查应当在客户端和服务器端都执行——之所以要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。   在客户端,攻击者完全有可能获得网页的源代码,修改验证合法性的脚本(或者直接删除脚本),然后将非法内容通过修改后的表单提交给服务器。因此,要保证验证操作确实已经执行,唯一的办法就是在服务器端也执行验证。你可以使用许多内建的验证对象,例如RegularExpressionValidator,它们能够自动生成验证用的客户端脚本,当然你也可以插入服务器端的方法调用。如果找不到现成的验证对象,你可以通过CustomValidator自己创建一个。   ⑸ 将用户登录名称、密码等数据加密保存。加密用户输入的数据,然后再将它与数据库中保存的数据比较,这相当于对用户输入的数据进行了“消毒”处理,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入SQL命令。System.Web.Security.FormsAuthentication类有一个HashPasswordForStoringInConfigFile,非常适合于对输入数据进行消毒处理。   ⑹ 检查提取数据的查询所返回的记录数量。如果程序只要求返回一个记录,但实际返回的记录却超过一行,那就当作出错处理。
      

  8.   

    http://community.csdn.net/Expert/topicview.asp?id=3803170
      

  9.   

    FreeTextBox是不错,不像WebHtmlEditor变态收费<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Public_About.aspx.cs" Inherits="admin_Public_About" ValidateRequest="false" %>楼主你应该是没加这句  ValidateRequest="false"
      

  10.   

    我肯定加了 ValidateRequest="false"。to:LoveCherry(论成败,人生豪迈;大不了,重头再来!^_^) 
    你给的那个帖里面说只要用存储过程传递参数的方式之行SQL语句就可以减小用户输入产生的安全隐患了。多谢你了