一. SQL注入的原理和防御机制
SQL是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,达到欺骗服务器执行恶意SQL命令。
简单来说,就是在登陆界面,域名里输入恶意SQL代码。
防御机制:
-
过滤检查:
检查输入的数据格式。可以通过正则表达式实现。
比如要输入订单号这种,应该是数字,就检查一下输入的是不是数字。 -
字符串过滤
字符串匹配危险字符:
public static boolean sql_inj(String str){
String inj_str = "'|and|exec|insert|select|delete|update|
count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
String inj_stra[] = split(inj_str,"|");
for (int i=0 ; i < inj_stra.length ; i++ ){
if (str.indexOf(inj_stra[i])>=0){
return true;
}
}
return false;
}
- 特殊符号转义
当出现换行符、引号、斜杠等特殊字符时,对这些特殊字符进行转义。
for (int i = 0; i < stringLength; ++i) {
char c = x.charAt(i);
switch (c) {
case 0: /* Must be escaped for 'mysql' */
buf.append('\\');
buf.append('0');
break;
case '\n': /* Must be escaped for logs */
buf.append('\\');
buf.append('n');
break;
case '\r':
buf.append('\\');
buf.append('r');
break;
case '\\':
buf.append('\\');
buf.append('\\');
break;
case '\'':
buf.append('\\');
buf.append('\'');
break;
case '"': /* Better safe than sorry */
if (this.usingAnsiMode) {
buf.append('\\');
}
buf.append('"');
break;
case '\032': /* This gives problems on Win32 */
buf.append('\\');
buf.append('Z');
break;
- 不使用sql字符串拼接,而是用参数化语句代替
例:
string Account =Request.Form["Account"];
string sql = "select id,Name,Account from User where Account = @Account";
SqlParameter[] values = new SqlParameter[] { //参数化查询, 防止sql注入
new SqlParameter("@Account",Account),
};
DataTable datatable = DBHelper.GetDataTable(sql, values);
一般的网站会在获得用户的输入后,使用SQL字符串拼接获得完整sql语句,但是这样会产生漏洞,假如用户输入恶意SQL代码,也会被服务器执行。
所以我们应使用参数化查询语句,如例子中所示,这样数据库就不会把用户输入的当作SQL语句去执行。因为数据库已经提前完成了SQL指令的编译。
二. XSS原理和防御机制
XSS(跨站脚本漏洞)是指往web页面里加入恶意Script代码,当用户浏览该页面时,嵌入其中的代码就会被执行。
三个种类:
反射型XSS:攻击者事先做好攻击链接和页面,需要欺骗用户去点击链接,触发恶意代码。
存储型XSS:在有评论或者发布文章的网站,如果输入没有经过过滤,就很可能将代码储存到服务器中。别的用户访问该界面都会触发代码。
DOM型XSS:基于文档对象模型Document Object Model的一种漏洞,这种漏洞与平台,编程语言无关。DOM模型允许程序或脚本动态访问和更新文档内容、结构和样式,处理后的结果能成为显示页面的一部分。
反射型XSS:不持久的,通常是在网站中寻找一个漏洞,这个漏洞往往存在于搜索框表单,黑客知道这里存在漏洞后就会编写特制的URL,达到盗取cookie等目的。一旦特制URL完成,黑客会通过垃圾邮件或留言板的帖子等诱导用户点击。这种URL欺骗性强是因为它真的包含了正确的域名。
储存型XSS:持久的,最常发生在社区网站和Web邮件网站。黑客在评论、留言板、HTML电子邮件和其他许多地方提交XSS漏洞利用代码,一旦提交成功网页会被感染,所有浏览页面的用户都会被攻击。
防御XSS方法:
1.永远不信任用户的输入,过滤,用正则表达式,只接受所期待的长度,格式。
2. 过滤非法内容如单引号等,转义非法字符,标签(http等)。