——选自《深入Ajax : 架构与最佳实践 = Advanced Ajax : architecture and best practices/ (美)Shawn M.Lauriat著;张过,宋会敏等译》

SQL注入

SQL注入攻击是指利用数据库服务器支持的SQL语法,以开发人员意料之外的方式执行SQL命令。这种攻击的主要形式是滥用传递到SQL中的未转义字符串,即滥用原本与SQL代码无关的GET或POST输出。结果是攻击者可以运行应用程序的数据库用户有权运行的任何SQL语句。利用SQL注入,攻击者可以获得帐户信息、破坏数据,甚至在数据库提供了相应方法并允许它运行的情况下,还能够运行系统命令。

攻击方式

例如:明文登录时,根据请求username=admin&password=123&submit=Login和变量赋值,很可能推断出类似下面的验证用户身份的查询语句:

string query = "SELECT id, name FROM users WHERE login = '" + username + "' AND password = '" + password_hash + "'";

(注:这个查询中包含一个password_hash变量,而不是简单的使用密码,因为应用程序永远不能以明文形式保存密码(如用户银行帐户的密码),假如应用程序的某一部分设计成了以明文或者可逆的字符串保存密码,那么即使不必完全重新设计,也要对该部分重新调整。

另外,任何散列计算都必须使用salt。salt是传递给散列算法中的一个值,用于以统一方式修改输出结果,

可以参考 http://hashtoolkit.com/ 或者 http://blog.csdn.net/wxwzy738/article/details/16839339/

攻击者如果输入admin'-- 这个用户名并以admin身份获得验证,那么无需猜测或对密码实施暴力破解,就可以运行下面这条查询语句:

SELECT id, name FROM users WHERE login = 'admin' --' AND password = 'fb2daecbcff8a328dfc4f03a4a5ef3a0'

(或者输入admin' OR '0' = '1或admin' exec xp_cmdshell 'format d:/s' --等将会执行其他的SQL命令。)

这条查询语句将会取得以admin身份登录的用户id和name,而不理会密码比较,密码比较目前位于一条注释的开始之后,因此根本不会在SQL语句中存在。这样就保证了密码测试永远不会发生,更不必说影响验证用户了。

(注意:如果把sql语句写成这样,也可以防止sql注入:select * from Customer where Password = '{0}' and UserName ='{1}')

过滤处理

开发人员可以在刚接收到请求时执行过滤操作。由于通过HTTP请求提交的字符串大多可以解析为预期的数据类型(从整数到原始文本),因此接收到这些数据的初始代码可以将无效的值过滤掉。

/// <summary>
/// 对username值进行过滤以确保它只包含字母
/// </summary>
/// <param name="username">用户名</param>
/// <returns>true - 没有注入, false - 有注入 </returns>
public bool filterSql(string username)
{
int length;
username = username.ToLower().Trim();
length = username.Length;
username = username.Replace("'", "");
username = username.Replace("-", "");
if (length == username.length)
return ture;
return false;
}
//检测用户名
List<string> list = new List<string>();
if(filterSql(Request["username"]))
{
list.Add(Request["username"]);
}
list.Add(Request["password"]);

虽然要对username值执行过滤以确保它只包含字母,但对password值则没有过滤,因为密码应该接收任何字符。此外,即使实际的数据表现为实际输入的散列形式,后期也不会对其进行任何过滤处理,以便与其他验证管理逻辑保存一致。

预处理

string sql = "SELECT id, name FROM users WHERE login = @username";
SqlParameter[] cellParms =
{
new SqlParameter("@username", SqlDbType.NVarChar,)
};
//对username值进行预处理
cellParms[].Value = Request["username"]; //运用ADO.NET的SqlCommand对象执行SQL
SqlCommand cmd = new SqlCommand();
cmd.Connection = new SqlConnection(connString);
cmd.CommandText = sql;
cmd.CommandType = CommandType.Text;
if (cellParms != null)
{
foreach (SqlParameter parm in cellParms)
{
cmd.Parameters.Add(parm);
}
}
//执行处理后的sql语句
SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

简而言之,要最有效的避免SQL注入攻击,必须根据要求的数据类型过滤所有输入,并转义SQL语句中的所有参数。转义参数时,可以为预处理语句绑定参数,也可以在数据库不支持预处理语句时,使用针对数据库引擎的内部库函数。

数据库连接字符串参考:https://www.connectionstrings.com/

防止 SQL 注入的方法(摘抄)的更多相关文章

  1. 在php中防止SQL注入的方法

    摘要:我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最主要就是要配置php.ini中的内容,让我们执行 php能够更安全.整个PH ...

  2. 防御SQL注入的方法总结

    这篇文章主要讲解了防御SQL注入的方法,介绍了什么是注入,注入的原因是什么,以及如何防御,需要的朋友可以参考下   SQL 注入是一类危害极大的攻击形式.虽然危害很大,但是防御却远远没有XSS那么困难 ...

  3. mysql进阶(二十四)防御SQL注入的方法总结

    防御SQL注入的方法总结 这篇文章主要讲解了防御SQL注入的方法,介绍了什么是注入,注入的原因是什么,以及如何防御,需要的朋友可以参考下. SQL注入是一类危害极大的攻击形式.虽然危害很大,但是防御却 ...

  4. Python中防止sql注入的方法详解

    SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库.下面这篇文章主要给大家介绍了关于Python中 ...

  5. python防止sql注入的方法

    python防止sql注入的方法: 1. 使用cursor.execute(sql, args)的参数位: sql_str = "select * from py_msgcontrol.py ...

  6. PHP+Mysql防止SQL注入的方法

    这篇文章介绍的内容是关于PHP+Mysql防止SQL注入的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 方法一: mysql_real_escape_string -- 转义 S ...

  7. php中防止SQL注入的方法

    [一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最 ...

  8. 防止SQL注入的方法

    方法1⃣️addslashes(); $username=addslashes($_POST['username']); 方法2⃣️mysql_escape_string(); 方法3⃣️开启魔术引号 ...

  9. 转:PHP中防止SQL注入的方法

    [一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最 ...

随机推荐

  1. 同是url参数传进来的值,String类型就用getAttribute获取不到,只能用getParameter获取,而int就两个都可以这是为什么?

    这是因为int的属性是id,这是在被放到modeldriver中的user所具有的属性,传递过来的参数如果和user的属性重名,struts2的有类似beanutil之类的工具会自动封装参数,这时候用 ...

  2. SGU 183 Painting the balls (优化的动态规划)

    题意:给n个白球,选其中一些涂为黑色,且给了涂第i个球的花费为ci,要求每m个连续的球中至少有两个黑球,问最小花费是多少? 容易想到一个方程dp[i][j]=min{dp[k][i]}+c[j] dp ...

  3. ACM - KMP题目小结 (更新中)

    KMP算法题型大致有两类,一类是next数组的应用,一类是匹配问题. next数组大多数是求字符串周期,或者是与前缀后缀有关,也可以应用在DP中.需要对next数组有一定理解才能做得出. next数组 ...

  4. 巧用nginx屏蔽对用户不可见的文件

    事情的起因是这样的--前端的项目中有一些.less之类的源文件,而为了方便迭代更新发布,直接就把整个工程放到了www目录下. 这样虽然方便了,但是会带来一些安全隐患——用户可以访问/盗取这些源文件. ...

  5. hdu 2098

    ps:TLE一次....因为判断素数的时候没开方...作死.. 代码: #include "stdio.h" #include "math.h" int inp ...

  6. openstack 中 log模块分析

    1 . 所在模块,一般在openstack/common/log.py,其实最主要的还是调用了python中的logging模块: 入口函数在 def setup(product_name, vers ...

  7. java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState解决?

    做项目到最后整合的时候测试的时候发现  切换tab更换fragment的时候抛出了这个异常,根据异常信息Can not perform this action after onSaveInstance ...

  8. VIM_插件

    VIM进阶:插件     通过一段时间的练习,你就可以非常熟练的使用VIM.即使是"裸奔",VIM已经足够强大,能够完成日常的绝大部分工作.     但VIM更加强大的是它的扩展机 ...

  9. Android Studio And Gradle

    AS特色: 智能感知体验特好,堪比VS 布局预览,手写布局后预览页面即时显示,便于布局调整和优化 编辑速度飞快流畅,毫无eclipse的卡顿 布局或源码中有图标和颜色的预览,十分直观 调试时体验极佳 ...

  10. 前App Store高管揭秘:关于“苹果推荐”的七大真相

    相信你已经看过很多这样那样关于如何获得苹果商店推荐的攻略了,但其实很多人依然陷入了很大的误区.前不久采访了前App Store团队高管Greg Essig,向各位开发者揭示关于获得苹果推荐的真相. 在 ...