安全开发规范
安全编码的基本准则
不要相信⽤户的任何输⼊数据,因为所有数据都是可以伪造的。⽤户数据包括HTTP请求中的⼀切,例如:QueryString, Form, Header, Cookie, File
服务端在处理请求前,必须先验证数据是否合法,以及⽤户是否具有相关的操作权限。注意:客户端的界⾯权限控制不能保证系统安全性,那只是为了增强⽤户体验⽽已。
禁⽌拼接,SQL注⼊,XSS攻击的产⽣都与拼接有关,它们都是由于缺乏转义处理造成的。
客户端对任何⼈都是透明的,因此尽量不要将敏感数据发送到客户端,必要时⼀定要加密处理。
敏感数据应该加密(或者Hash)保存,⽇志及调试⼿段中不能出现敏感数据。
涉及数据修改的操作,必须采⽤POST⽅式提交,防⽌利⽤漏洞进⾏恶意调⽤。
动态的反射调⽤应该仅针对公开⽅法或者有确定标记的⽅法。
操作⽂件或者⽬录,不能直接依据HTTP数据来决定路径,应该有明确的⽬标(范围)或者采⽤⽩名单⽅
式。
SQL注⼊
原则:不允许拼接【SQL字符串】,只能使⽤参数化SQL语句。
注意:存储过程中也不允许拼接【SQL字符串】,存储过程中可以拼接参数化SQL,需要使⽤sp_executesql来执⾏参数化SQL。
XSS攻击
原则:输出到HTML中的⽂本部分,必须做编码处理(HTML, URL, JS),可使⽤HttpUtility的相关⽅法:
HtmlEncode,HtmlAttributeEncode,UrlEncode,JavaScriptStringEncode
注意:如果是在SQL中拼接HTML,需要在SQLSERVER中创建⼀个HtmlEncode⾃定义函数,并在拼接时调⽤。
如果是在JavaScript中拼接HTML,需要在前端创建⼀个HtmlEncode⾃定义函数,并在拼接时调⽤。
总之:任何地⽅都不能将⽤户输⼊的⽂本内容直接输出到HTML中。
⽰例代码:
1、服务端(ASP.NET 2.0 WebForm)
<pre class="description"><%= comment.Description.HtmlEncode() %></pre>
2、服务端(ASP.NET 4.0 WebForm )
<pre class="description"><%: comment.Description %></pre>
3、客户端HtmlEncode实现:
String.prototype.HtmlEncode = function(){
var div = ateElement("div");
div.ateTextNode(this));
return div.innerHTML;
};
Cookie安全
原则:不能将敏感数据【直接】保存到Cookie中。
注意:如果确实需要将敏感数据临时保存到Cookie中,必须做加密处理。
在解密读取Cookie时,如果解密失败(出现异常),不能对外抛出异常!
保护Cookie的⽅法
1、加密Cookie,建议使⽤ FormsAuthentication.Encrypt()
private HttpCookie CreateSecurityCookie(string cookieName, string text)
{
FormsAuthenticationTicket ticket = newFormsAuthenticationTicket(
2, "fish", DateTime.Now, DateTime.Now.AddDays(30d), false, text);
string str = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = newHttpCookie(cookieName, str);
cookie.HttpOnly = true; // 不允许 JavaScrit 代码访问,主要也是为了防⽌XSS攻击。
return cookie;
}
2、在fig 中统⼀配置 HttpOnly
<httpCookies httpOnlyCookies="true" />
加密算法
原则:
密码之类的敏感数据⼀定不能明⽂保存,只能保存Hash值,并在计算Hash时加⼊salt处理。
不得⾃⼰编写加密算法,因为不专业,安全性⽆法保证,但允许对标准加密算法进⾏封装。
Hash算法推荐选择SHA256
对称加密算法推荐选择AES
解密失败时,不得对外抛出异常,否则会被【Padding Oracle Attack】攻击。
不建议使⽤⾮对称加密⽅法。
HTTP请求
原则:
涉及更新业务数据的请求,必须要采⽤POST请求,防⽌被XSS攻击后产⽣恶意调⽤。
例如:<img src=“/service/User/Add.aspx?name=xxx&pwd=123&type=1”/>
如果请求中包含敏感数据,必须要采⽤POST请求,防⽌代理服务器⽇志把敏感数据记录下来。
前端不得提交HTML代码⽚段,防⽌被利⽤产⽣XSS攻击。
敏感数据处理
原则:
包含敏感信息的页⾯,⼀定不能设置启⽤HTTP缓存。需要调⽤x()服务端敏感不得保存到Application和Session中,因为Trace信息中会显⽰出来。
⽇志或者调试信息不得记录敏感信息,⽐如携程信⽤卡资料泄露事故。
ASP.NET 的⾃⾝安全机制
原则:不要修改以下的配置项。
<httpRuntime
maxRequestLength="4096"
enableHeaderChecking="true"
/>
说明:
maxRequestLength:是为了防⽌拒绝服务攻击,不能随意修改它。enableHeaderChecking:检查HTTP标头是否存在注⼊式攻击。sql server拼接字符串函数
正在发版的ASP.NET配置
原则:正式发布的配置不允许开启调试功能。
<trace enabled="false"/>
<compilation debug="false">
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论