原文地址:https://www.cnblogs.com/xiaochun126/p/5113371.html
1、安全攻击
1、SQL、HTML、JS、OS命令注入
2、XSS跨站脚本攻击,利用站内信任的用户,在web页面插入恶意script代码
3、CSRF跨站请求伪造,通过伪装来自信任用户的请求来利用受信任的网站。
4、目录遍历漏洞
5、参数篡改
6、会话劫持
2、防止攻击的措施总结
1) 对用户输入的数据进行全面安全检查或过滤,尤其注意检查是否包含SQL 或XSS特殊字符。
验证用户输入的数据,包括值、类型、范围等等,用验证控件进行验证 RequiredFieldValidator RangeValidator RegularExpressionValidator
这些检查或过滤必须在服务器端客户端都进行。客户端服务端都要进行验证,客户端为了提高用户体验,服务端才可以有效防止威胁
2)不要使用管理员权限的数据库连接,不要使用动态拼接sql
3)机密信息加密,不能使用明文
4)每个页面加载时,对用户合法性进行判断。
5)登录后session中的敏感信息需要加密,避免在永久cookies中存储敏感信息,重要的cookie标记为http only
6)发送敏感信息时使用SSL、POST方式,尽量使用新型web HSTS安全协议
7)不要直接抛出异常的详细信息给用户,异常返回友好的页面,防止用户看到敏感信息
8)在服务器与网络的接口处配置防火墙,用于阻断外界用户对服务器的扫描和探测。
9)限制网站后台访问权限,如:禁止公网IP访问后台;禁止服务员使用弱口令。
10)关闭windows的8.3格式功能。DOS系统下的命令方式为8.3格式,即文件名不超过8个字符,扩展名不超过3个字符。形如:???.exe 。
现在Windows系统文件名长度最长可达255个字符了。
11)限制敏感页面或目录的访问权限。
12)项目发布前使用使用漏洞扫描软件,如IBM appScan,UnisWebScanner,对安全性进行评估。
安全漏洞及防止:
1、sql注入漏洞
1、在框架中内置对有害语句及符号的过滤,如insert ‘ update,在基类进行过滤,这样子类就不用关心也可以避免这些常用的攻击了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
/// <summary>
/// 过滤 Sql 语句字符串中的注入脚本
/// </summary>
/// <param name="source">传入的字符串</param>
/// <returns>过滤后的字符串</returns>
public
static
string
SqlFilter(
string
source)
{
if
(
string
.IsNullOrEmpty(source))
{
return
""
;
}
//单引号替换成两个单引号
source = source.Replace(
"'"
,
"''"
);
source = source.Replace(
"\""
,
""
);
source = source.Replace(
"&"
,
"&"
);
source = source.Replace(
"<"
,
"<"
);
source = source.Replace(
">"
,
">"
);
source = source.Replace(
"delete"
,
""
);
source = source.Replace(
"update"
,
""
);
source = source.Replace(
"insert"
,
""
);
//半角封号替换为全角封号,防止多语句执行
source = source.Replace(
";"
,
";"
);
//半角括号替换为全角括号
source = source.Replace(
"("
,
"("
);
source = source.Replace(
")"
,
")"
);
///要用正则表达式替换,防止字母大小写得情况
//去除执行存储过程的命令关键字
source = source.Replace(
"Exec"
,
""
);
source = source.Replace(
"Execute"
,
""
);
//去除系统存储过程或扩展存储过程关键字
source = source.Replace(
"xp_"
,
"x p_"
);
source = source.Replace(
"sp_"
,
"s p_"
);
//防止16进制注入
source = source.Replace(
"0x"
,
"0 x"
);
return
source;
}
|
2、坚持使用参数化方式赋值
3、不要直接抛出异常的详细信息给用户,异常返回友好的页面,防止用户看到数据库的细节,关闭了Web.Config的CustomErrors的时候,可能就不会看到。
<system.web>
<compilation debug="true" targetframework="4.0" />
</system.web>
2、XSS又叫CSS--Cross Site Script 跨站脚本攻击
1、清理用户输入,过滤js代码,过滤特殊字符
[1] <>(尖括号) [5] ;(分号)
[2] "(引号) [6] ()(括号)
[3] '(单引号) [7] &(& 符号)
[4] %(百分比符号) [8] +(加号)
2、使用HttpUitility及AntiXSSLibrary类库中的方法对html代码进行处理
赋值不会弹框 this.lblName.Text = Encoder.HtmlEncode("<script>alert('OK');</script>");
编码方法 | 使用场景 | ||||
HtmlEncode(String) | 不受信任的HTML代码。 | ||||
HtmlAttributeEncode(String) | 不受信任的HTML属性 | ||||
JavaScriptEncode(String) | 不受信任的输入在JavaScript中使用 | ||||
UrlEncode(String) | 不受信任的URL | ||||
VisualBasicScriptEncode(String) | 不受信任的输入在VBScript中使用 | ||||
XmlEncode(String) | 不受信任的输入用于XML输出 | ||||
XmlAttributeEncode(String) | 不 受信任的输入用作XML属性 |
3、用户信息用MD5加密
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
#region MD5加密
/// <summary>
/// 获取MD5哈希值
/// </summary>
/// <param name="Text">字符串</param>
/// <returns>MD5哈希值</returns>
public
static
string
GetMd5Hash(
string
Text)
{
MD5 md5 = MD5.Create();
byte
[] data = md5.ComputeHash(Encoding.Default.GetBytes(Text));
StringBuilder builder =
new
StringBuilder();
for
(
int
i = 0; i < data.Length; i++)
{
builder.Append(data[i].ToString(
"x2"
));
}
return
builder.ToString();
}
/// <summary>
/// 验证MD5哈希值
/// </summary>
/// <param name="Text">字符串</param>
/// <param name="TextHash">哈希值</param>
/// <returns>相同返回True,不同返回False</returns>
public
static
bool
VerifyMd5Hash(
string
Text,
string
TextHash)
{
string
hash = GetMd5Hash(Text);
StringComparer comparer = StringComparer.OrdinalIgnoreCase;
if
(0 == comparer.Compare(hash, TextHash))
{
return
true
;
}
else
{
return
false
;
}
}
#endregion
|
4、在页面加载时判断用户是否登录,如果没有登录则转到登录界面,每个页面继承基类BaseControl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
protected
override
void
OnActionExecuting(ActionExecutingContext filterContext)
{
//身份验证
if
(CurrentUser ==
null
)
{
string
request = System.Web.HttpContext.Current.Request.Headers.Get(
"X-Requested-With"
);
if
(
string
.Compare(request,
"XMLHttpRequest"
,
true
) == 0)
{
filterContext.Result =
new
JsonResult { Data =
"登录超时,请刷新页面!"
};
filterContext.HttpContext.Response.ContentType =
"text/plain;charset=UTF-8"
;
filterContext.HttpContext.Response.Status =
"403 Internal Server Error"
;
filterContext.HttpContext.Response.StatusCode = 403;
}
else
{
filterContext.Result =
new
RedirectResult(
"~/Login/SessionOutTime"
);
}
}
}
|