SQL注入漏洞曾经是Web应用程序的噩梦,CMS、BBS、Blog无一不曾受其害。
SQL注入的原理
以往在Web应用程序访问数据库时一般是采取拼接字符串的形式,比如登录的时候就是根据用户名和密码去查询:
string sql = "SELECT TOP 1 * FROM [User] WHERE UserName = ‘” + userName + “‘ AND Password = ‘” + password + “‘”;
其中userName和password两个变量的值是由用户输入的。在userName和password都合法的情况下,这自然没有问题,但是 用户输入是不可信的,一些恶意用户只要用一些技巧,就可以绕过用户名、密码登录。
假设password的值是”1′ or ‘1′ = ‘1“,userName的值随便取,比如是”abc”,那变量sql的 值就是:
"SELECT TOP 1 * FROM [User] WHERE UserName = ‘abc’ AND Password = ‘1′ or ‘1′ = ‘1′”
由于’1′ = ‘1′恒为真,因此只要User表中有数据,不管UserName、Password的值是否匹配,这条SQL命令准能查出记录来。就这样,登录系统就被 破解了。
以往的防御方式
以前对付这种漏洞的方式主要有三种:
字符串检测:限定内容只能由英文、数字等常规字符,如果检查到用户输入有特殊字符,直接拒绝。但缺点是,系统 中不可避免地会有些内容包含特殊字符,这时候总不能拒绝入库。
字符串替换:把危险字符替换成其他字符,缺点是危险字符可能有很多,一一枚举替换相当麻烦,也可能有漏网之 鱼。
存储过程:把参数传到存储过程进行处理,但并不是所有数据库都支持存储过程。如果存储过程中执行的命令也是通 过拼接字符串出来的,还是会有漏洞。
参数化查询
近年来,自从参数化查询出现后,SQL注入漏洞已成明日黄花。
参数化查询(Parameterized Query 或 Parameterized Statement)是访问数据库时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值。
在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成SQL指令的编译后,才 套用参数运行,因此就算参数中含有指令,也不会被数据库运行。Access、SQL Server、MySQL、SQLite等常用数据库都支持参数化查询。
在ASP程序中使用参数化查询
ASP环境下的参数化查询主要由Connection对象和Command对象完 成。
Access数据库只支持匿名参数,在传入参数的位置用问号代替即可。SQL Server数据库虽然支持匿名和非匿名的参数,但是在ASP中也仅能使用匿名参数。
var conn = Server.CreateObject("ADODB.Connection");
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("Test.mdb");
conn.Open();
var cmd = Server.CreateObject(“ADODB.Command”);
cmd.ActiveConnection = conn;
cmd.CommandType = 1;
cmd.CommandText = “SELECT TOP 1 * FROM [User] WHERE UserName = ? AND Password = ?“;
cmd.Parameters.Append(cmd.CreateParameter(”@UserName”, 200, 1, 20, “user01″));
cmd.Parameters.Append(cmd.CreateParameter(”@Password”, 200, 1, 16, “123456″));
var rs = cmd.Execute();
Response.Write(rs(”UserId”).value);
rs.Close();
conn.Close();
在ASP.NET程序中使用参数化查询
ASP.NET环境下的查询化查询也是通过Connection对象和Command对象完成。如果数据库是SQL Server,就可以用有名字的参数了,格式是“@”字符加上参数名。
SqlConnection conn = new SqlConnection("server=(local)\\SQL2005;user id=sa;pwd=12345;initial catalog=TestDb");
conn.Open();
SqlCommand cmd = new SqlCommand(“SELECT TOP 1 * FROM [User] WHERE UserName = @UserName AND Password = @Password“);
cmd.Connection = conn;
cmd.Parameters.AddWithValue(”UserName”, “user01″);
cmd.Parameters.AddWithValue(”Password”, “123456″);
SqlDataReader reader = cmd.ExecuteReader();
reader.Read();
int userId = reader.GetInt32(0);
reader.Close();
conn.Close();
MySQL的参数格式与SQL Server有点区别,是以“?”加上参数名。
MySqlConnection conn = new MySqlConnection("server=127.0.0.1;uid=root;pwd=12345;database=test;");
conn.Open();
MySqlCommand cmd = new MySqlCommand(“SELECT * FROM `User` WHERE UserName = ?UserName AND Password = ?Password LIMIT 1″);
cmd.Connection = conn;
cmd.Parameters.AddWithValue(”UserName”, “user01″);
cmd.Parameters.AddWithValue(”Password”, “123456″);
MySqlDataReader reader = cmd.ExecuteReader();
reader.Read();
int userId = reader.GetInt32(0);
reader.Close();
conn.Close();
本篇文章来源于 站长资讯网 原文链接:http://www.chinahtml.com/1006/asp-127561481718846.html
分享到:
相关推荐
SQL参数化是指在执行SQL语句时,使用参数代替原始的SQL语句,从而防止恶意的SQL语句注入。 在上面的代码中,我们可以看到两个不同的参数化传递方式。第一个方式使用DBHlep类,通过params SqlParameter[] values参数...
为了解决这个问题,C#提供了一种有效的方法——参数化查询,这是一种安全且高效的方式来执行数据库操作,能有效地防止SQL注入攻击。 参数化查询的核心思想是将SQL语句和实际的值分离,通过占位符(如`?`或`@param`...
在上面的代码中,我们使用参数化查询来防止SQL注入。我们使用SqlParameter来传递用户名和密码,而不是拼接SQL字符串。这使得攻击者无法注入恶意的SQL代码。 因此,参数化查询能够防止SQL注入的原因是它将用户输入的...
4. **漏洞检测方法**:如使用黑名单过滤、白名单校验、参数化查询、预编译语句等防御手段。 5. **自动化扫描**:编写脚本或程序,模拟用户输入,尝试注入攻击,观察返回结果,判断是否存在漏洞。 6. **HTTP请求与...
在Sql Server中,参数化查询是提高查询性能和防止SQL注入攻击的有效方法之一。其中,where in和like是两个常用的查询条件,然而它们的参数化实现却不是那么简单。本文将详细介绍where in和like的参数化查询实现方法...
1. 使用参数化查询或预编译的SQL语句,如ADO.NET的PreparedStatement,防止SQL代码与用户输入混合。 2. 对用户输入进行严格的过滤和验证,拒绝包含特殊字符的输入。 3. 限制数据库用户的权限,只允许执行必要的操作...
1. **参数化查询**:使用参数化查询(也称为预编译语句),可以确保用户输入的数据不会与SQL命令混淆,从而消除SQL注入的风险。 2. **输入验证**:除了过滤特殊字符,还应检查输入的格式和范围,确保它们符合预期的...
1. **参数化查询**:使用预编译的SQL语句,将用户输入作为参数传递,防止SQL代码被直接插入到查询中。 2. **输入验证**:对用户提供的数据进行严格的检查,只允许预期的数据类型和格式。 3. **最小权限原则**:...
2. **参数化查询**:使用预编译语句或参数化查询,确保用户提交的数据不会被解释为SQL命令的一部分。 3. **最小权限原则**:确保应用程序使用的数据库账户只拥有完成其任务所需的最小权限。 4. **错误处理**:合理地...
`SQL注入漏洞实例演示.rar`文件可能包含一个小型的Web应用程序,用于模拟SQL注入漏洞,以及修复后的代码,展示如何使用参数化查询来防止此类攻击。 通过学习这个示例,开发者可以更好地了解SQL注入的工作方式,并在...
这个工具类可能提供了自动转义或参数化查询的功能,比如`mysqli_real_escape_string`函数,或者更高级的ORM框架如Doctrine,它们内置了防止SQL注入的安全机制。 4. **最小权限原则**:数据库连接账户应具有执行其...
漏洞产生通常是由于程序员编写了不安全的代码,比如在SQL语句中直接拼接用户输入的数据,未能对输入数据进行严格的过滤和转义,或者未使用参数化查询等安全措施。 3. **漏洞影响范围** 根据文件中描述,CmsEasy V...
12. **使用SQLMap工具进一步验证**:通过自动化工具SQLMap来验证是否存在SQL注入漏洞,并尝试获取更多的数据库信息。 #### SQL注入漏洞分析 - **原理**:SQL注入是一种常见的Web安全漏洞,通过向应用程序的输入字段...
二:如果用SQL语句,那就使用参数化,添加Param 三:尽可能的使用存储过程,安全性能高而且处理速度也快 四:屏蔽SQL,javascript等注入(很是主要的),对于每个文件写是不太可能的。所以要找到对所有文件起...
1. 参数化查询:使用预编译的SQL语句(如PreparedStatement),将用户输入作为参数传递,而不是直接拼接到SQL字符串中。这样可以防止恶意代码改变SQL语句的结构。 2. 使用存储过程:通过存储过程与数据库交互,减少...
"修改请求参数 防止 SQL 注入、防止脚本注入"这个主题聚焦于如何保护系统免受两种常见的攻击方式:SQL注入和跨站脚本(XSS)攻击。这两种攻击都利用了不安全的用户输入来执行恶意代码,可能对数据完整性、用户隐私...
SQL 参数化查询详解 SQL 参数化查询是指在 SQL 语句中...通过使用参数化查询,可以避免 SQL 注入式攻击,提高查询效率,简化开发过程。因此,在实际开发中,应该尽量使用 SQL 参数化查询来提高数据库的安全性和效率。
由于ORM框架内部已经实现了参数化查询,因此无需担心SQL注入的问题。 ##### 3. 使用第三方库 除了使用Python自带的库外,还可以考虑引入第三方库,如`psycopg2`(适用于PostgreSQL)或`pymysql`(适用于MySQL),...
这种工具通常会检查SQL查询语句的构造方式,例如是否存在字符串拼接构建SQL语句的情况,或者是否使用了预编译的参数化查询。静态代码检测可以在开发阶段就发现问题,避免潜在的安全隐患进入生产环境。 然后,测试用...