金蝶云星空二开防止SQL注入方案学习分享(代码层面规避、系统进行站点加固)

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-16浏览:1

金蝶云星空二开防止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)### 以往的防御方式以前对付这种漏洞的方...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息