SQL注入和XSS攻击

一. SQL注入的原理和防御机制
SQL是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,达到欺骗服务器执行恶意SQL命令。

简单来说,就是在登陆界面,域名里输入恶意SQL代码。

防御机制:

  1. 过滤检查:
    检查输入的数据格式。可以通过正则表达式实现。
    比如要输入订单号这种,应该是数字,就检查一下输入的是不是数字。

  2. 字符串过滤
    字符串匹配危险字符:

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;
}
  1. 特殊符号转义
    当出现换行符、引号、斜杠等特殊字符时,对这些特殊字符进行转义。
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;

  1. 不使用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等)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值