1、 控制所有的输入
- 不要禁止ASP.NET系统验证机制(即不要把ValidateRequest设为False),如果确实需要禁止验证,只在需要的地方执行。(防止XSS攻击)
- 在所有的输入启用服务器端验证控件(Range, RequiredField,Custon or RegularExpression)
2、 不要向客户端返回未过滤的数据
- 在向客户端返回数据前使用HttpUtility.HtmlEncode或HttpUtility.UrlEncode.
- 如果需要允许一些特殊字符,先使用编码方法,然后用HTML代码替换它们。
// Encode thestring input from the HTML input text field
StringBuilder sb= new StringBuilder(HttpUtility.HtmlEncode(htmlInputTxt.Text));
// Selectivelyallow <b> and <i>
sb.Replace("<b>","<b>");
sb.Replace("</b>","</b>");
sb.Replace("<i>","<i>");
sb.Replace("</i>","</i>");
3、 不要使页面未过滤的数据生成SQL请求(防SQL注入)
4、 避免在网站树目录中储存敏感数据
- 将连接串写在web.config的<connectionStrings>中,并使用如下命令加密(或用其他更加复杂的加密方式,如带密钥的RSA加密)。先在服务器上布置后再加密。
cd website_directory
aspnet_regiis-pef "connectionStrings"
- 使用相同的命令来加密配置文件(如appSettings, identity, sessionState)中的敏感字段。
5、 不要给予一个没有检查路径和后缀的文件以任何权限
6、 不要信任不受你权限控制的任何不可靠元素
- 不要在viewstate中存放敏感字段,并且不要用其中的数据进行安全验证。
- 需要考虑加密viewstate。
- 如果你使用ViewState加密技术,并且在Web Farm中配置应用程序。你必须确定在各个服务器上散列的配置文件和密钥。
7、 不要在页面留下任何注释,若需要,使用ASP.NET注释
8、 不要暴露多余的安全信息
- 使用统一的错误页面,不要让系统级别信息返回客户端。
9、 不要让你的WebServer帮你管理错误
- 确保你的WEB服务不会返回含有过多细节的错误信息。
10、每个页面都必须验证用户访问
- 每打开一个页面都要检查用户是否通过登陆认证。
11、不要使用有规律的标识号
- 程序中所有的标识号必须使用GUID类型。
12、使用尽量少的缓存操作
- 所有包含敏感数据的页面必须包含下列标签(Set page topre-expire,No-cache,No-pragma-cache)。