金蝶云星空二开防止SQL注入方案学习分享(代码层面规避、系统进行站点加固)
@[TOC](金蝶云星空二开防止SQL注入方案学习分享)
## 1. 使用预处理语句(Prepared Statements)
### 以往的防御方式以前对付这种漏洞的方式主要有三种:
字符串检测:限定内容只能由英文、数字等常规字符,如果检查到用户输入有特殊字符,直接拒绝。但缺点是,系统 中不可避免地会有些内容包含特殊字符,这时候总不能拒绝入库。
字符串替换:把危险字符替换成其他字符,缺点是危险字符可能有很多,一一枚举替换相当麻烦,也可能有漏网之 鱼。
存储过程:把参数传到存储过程进行处理,但并不是所有数据库都支持存储过程。如果存储过程中执行的命令也是通 过拼接字符串出来的,还是会有漏洞。
预处理语句也称为参数化查询,是最有效的防御SQL注入的方法之一,它们允许开发者创建SQL模板,其中的用户输入被当作参数处理,而不是直接拼接到SQL字符串中,这样,即使用户输入含有恶意代码,数据库也会将其视为数据处理,而不是SQL命令的一部分。
### 参数化参数原理解析:
++什么是参数化查询? 一个简单理解参数化查询的方式是把它看做只是一个T-SQL查询,它接受控制这个查询返回什么的参数。通过使用不同的参数,一个参数化查询返回不同的结果。要获得一个参数化查询,你需要以一种特定的方式来编写你的代码,或它需要满足一组特定的标准。 有两种不同的方式来创建参数化查询。第一个方式是让查询优化器自动地参数化你的查询。另一个方式是通过以一个特定方式来编写你的T-SQL代码,并将它传递给sp_executesql系统存储过程,从而编程一个参数化查询。 这样的解释还是有点模糊,先看一例:例一:参数化查询 参数化查询(Parameterized Query 或 Parameterized Statement)是访问数据库时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值。 在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有指令,也不会被数据库运行。Access、SQL Server、MySQL、SQLite等常用数据库都支持参数化查询。++
//在ASP.NET程序中使用参数化查询
//ASP.NET环境下的查询化查询也是通过Connection对象和Command对象完成。如果数据库是SQL Server,就可以用有名字的参数了,格式是“@”字符加上参数名。
```java
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();
```
参数化查询被喻为最有效防止SQL注入的方法,那么存储过程一定是参数化过后的吗?如果存储过得利用传递进来的参数,再次进行动态SQL拼接,这样还算做是参数化过后的吗?如果存储过程一定是参数化过后的,那么是不是意味着,只要使用存储过程就具有参数化查询的全部优点了?如下存储过程:
```sql
CREATE PROCEDURE pro_getCustomers ( @whereSql nvarchar ( MAX ) ) AS DECLARE
@SQL nvarchar ( MAX )
SET @SQL = N'select * from dbo.Customer ' + @whereSql EXEC ( @SQL )
GO
```
### 解决方案参照:
[SQL参数化查询检测](https://wenku.my7c.com/article/485115152317163520?productLineId=1&isKnowledge=2&lang=zh-CN)
以采购入库单查询为示例
SELECT FParas FROM T_BAS_FormParameter WHERE (FParaObjId = @FParaObjId AND FUserId = @FUserId)
## 2. 对用户输入进行验证和转义
始终对用户的输入进行严格的验证,确保输入符合预期的格式,并对特殊字符进行转义,以防止它们被解释为SQL代码的一部分,可以使用PHP中的mysqli_real_escape_string()函数来转义输入。
## 3. 使用最小权限原则(数据库配置层面)
应用程序连接数据库的账户应仅拥有完成任务所必需的最小权限,这样即使发生SQL注入,攻击者能够执行的操作也会受到限制。
## 4. 实施错误处理
关闭详细的错误信息展示,避免泄露数据库结构等敏感信息,确保错误信息不会暴露过多的细节,从而减少攻击者可利用的信息。
## 5. 使用Web应用防火墙(WAF)
Web应用防火墙可以帮助检测和阻断SQL注入攻击,WAF通常包含一系列的安全规则,用来识别并阻止可疑的请求。
## 6. 定期更新和打补丁,站点加固拦截SQL注入
保持应用程序及其所有组件,包括数据库管理系统(DBMS),都得到及时的更新和打补丁,以保护免受已知漏洞的攻击。
操作方案:[云星空站点加固设置](https://wenku.my7c.com/article/372317007033027840?productLineId=1&isKnowledge=2&lang=zh-CN)
## 7. 进行安全审计和测试
定期进行安全审计和渗透测试,以便发现潜在的安全漏洞并进行修复,这有助于提高应用程序的安全性,并确保防护措施是有效的。
代码审计可使用第三方工具进行扫描。
金蝶云星空二开防止SQL注入方案学习分享(代码层面规避、系统进行站点加固)
@[TOC](金蝶云星空二开防止SQL注入方案学习分享)## 1. 使用预处理语句(Prepared Statements)### 以往的防御方式以前对付这种漏洞的方...
点击下载文档
本文2024-09-16 17:31:31发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-16265.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章