论文部分内容阅读
摘要:代码编写需要防范SQL注入,本文将阐述如何防范SQL注入攻击的方法及思路,能够帮助编程人员减少代码的SQL注入攻击。
关键字:SQL;注入
一、SQL注入攻击简介
SQL注入攻击是目前出现最多的一种网络攻击手段,它的出现,不是操作系统本身的问题,而是由于程序员编写程序时出现的BUG,攻击人员通过巧妙的程序输入,就可以绕过本身合法的SQL验证或SQL语言相关条件,最终实现整个数据库的所有数据的过程,也有不少数破坏者将数据贩卖,给社会及个人带来极大的危险和个人隐私信息的暴露。所以,程序员本身应该格外注意SQL注入攻击是如何发生的,在编写代码中如何去防范SQL注入攻击的发生。
二、SQL注入的攻击的思路
SQL注入攻击最常见的攻击思路是首先先查找SQL注入的位置,整个程序在哪些位置出现了SQL注入的漏洞,第二步,通过巧妙的编写SQL语句,完成对操作系统及数据库版本类型的判断,以判断当前数据库是什么厂家,数据库所在的操作系统是什么操作系统,以便于我们实现数据导出及其编写符合相应产品的SQL语句。第三步,就是针对不同类型的数据库和操作系统,进行SQL注入攻击。目前针对网站的SQL注入是最多的,也是最简单的一种攻击方式,当程序员在设计代码时,没有充分考虑到对用户输入的字符串进行过滤特殊字符,导致用户输入了经过精心编写的一段SQL语句后,就可以完成数据的窃取。
三、代码编写中SQL注入防范
我们在编写代码时要自行分析源代码中的漏洞,主要有两种方法,静态分析和动态分析,静态代码分析是指分析源代码,并不真正执行代码,只是去审核和分析源代码。动态分析是指在代码的运行过程中动态调试的加以分析,找到漏洞。而我们通常结合地使用两种方法用来防范我们的SQL注入攻击。
从不可信任来源收到的数据是容易受到感染,这些函数通常用于执行或涉及数据库的SQL语句,我们在编写此类函数或代码时应格外注意外来不可信任的数据输入,每种程序语言均有很多种不同形式来构造SQL语句,如果程序员没有对输入源,如表单、cookie、post变量等进行筛查或验证,很有可能就存在SQL注入的漏洞。string id=tbx.text; DataTable dt= SqlHelperCs.Execute(“select * from table where id=’”+id+”’”);以上代码就是用户直接将用户控件的输入值动态的传递给了构造SQL语句的函数,并且该语句没有对不可信输入源进行有效验证就被执行,这很容易引发SQL注入漏洞。通常我们需要跟踪变量的初始化来源,并且我们也要密切观察此变量是否中途被修改,所以我们在代码编写时应格外注意用户输入等易感染SQL注入的敏感区域,并使用一定的技巧来避免漏洞的可行性。想要构造有效的SQL注入,必须首先搞清楚当前数据库注入类型是数字还是字符串类型,当SQL注入攻击为数字时,是不需要加入单引号的,而其他类型则是需要使用单引号的。使用带数字值的SQL语句,例如:select * from table where id=1 使用带字符串值的SQL语句则为select * from table where id=’1’ 从SQL注入攻击时,攻击者非常注意的是使用字符串单引号的闭合问题,所以我们在编写代码时,需要将特殊字符输入给过滤掉,特别是单引号,空格之类的特殊输入符号。我们可以将输入的字符进行正则表达式匹配,匹配特殊字符的正则表达式为((?=[\x21-\x7e]+)[^A-Za-z0-9])x21-\x7e]+) [^A-Za-z0-9])。而针对于数字输入,经常以AND 1=1 或 OR 1=1 的形式存在,所以我们又要对连续输入的字符中不能包含SQL关键字为主要鉴别点,屏蔽掉AND或OR或UNION或SELECT等等SQL关键字。
1.领域驱动安全设计方法
领域驱动安全设计方法是一种设计代码的方法,以此设计的方法可以广泛用于典型的SQL注入领域,并且它针对的是一种接收广泛数据输入安全设计方法。大多数的代码编写过程中都會对输入允许使用的字符类型和长度加以限制,但随着程序的不断演化和代码增加,新添加的函数有可能会无意绕过了此类验证,所以我们需要专门为代码编写人员创建简单的模型,用来保证所涉及到此模式时,都能够显示的去表达及检验其有效性。通常我们以用户名和密码举例,用户名需要创建Username类,并且应为public类型,并且在类中,我们对原始输入的用户名变量进行封装,在输入时进行正则表达式的非法输入校验,这样做的好处是无论在代码的任何位置,当我们需要使用到用户名时,都可以使用Username类的对象,由于该类中变量是经过有效性校验的,我们可以认为它是有效性防止了SQL注入的变量,这样做的好处是可以避免重复性的检验逻辑,并且提高了团队安全防范意识,我们只需要对关键输入领域安全做好准入校验即可,这就是领域驱动安全的设计方法,追求公共资源的统一校验。
2、使用存储过程防范注入
数据库的存储过程是应用于数据库的配置层来实现的,可以针对特定的数据库用户及相应表,它会限制攻击者拼凑特殊闭合性字符串,因为只能调用存储过程,按要求传入参数,不符合参数数据库控制层将会阻止并报错。存储过程有助于减少潜在SQL注入攻击,我们可以根据数据库不同的版本,使用不同的存储过程语言来编写存储过程,Oracle的PL/SQL,SQL Server的Transact-SQL,以及MySQL的SQL2003标准。
参考文献:
[1]李博文.浅谈SQL注入漏洞的检测与防范[J].技术与市场,2020,27(11):102-103.
[2]刘建亮,乔兴华.SQL注入攻击与防范之研究[J].科学技术创新,2020(08):24-25.
作者简介:薛凯,男,山东省青岛市,1990年5月,本科,高级系统架构师,软件设计师,青岛市黄岛区人民医院信息中心工作,主要从事软件维护、软件开发
青岛市黄岛区人民医院 信息中心 266400
关键字:SQL;注入
一、SQL注入攻击简介
SQL注入攻击是目前出现最多的一种网络攻击手段,它的出现,不是操作系统本身的问题,而是由于程序员编写程序时出现的BUG,攻击人员通过巧妙的程序输入,就可以绕过本身合法的SQL验证或SQL语言相关条件,最终实现整个数据库的所有数据的过程,也有不少数破坏者将数据贩卖,给社会及个人带来极大的危险和个人隐私信息的暴露。所以,程序员本身应该格外注意SQL注入攻击是如何发生的,在编写代码中如何去防范SQL注入攻击的发生。
二、SQL注入的攻击的思路
SQL注入攻击最常见的攻击思路是首先先查找SQL注入的位置,整个程序在哪些位置出现了SQL注入的漏洞,第二步,通过巧妙的编写SQL语句,完成对操作系统及数据库版本类型的判断,以判断当前数据库是什么厂家,数据库所在的操作系统是什么操作系统,以便于我们实现数据导出及其编写符合相应产品的SQL语句。第三步,就是针对不同类型的数据库和操作系统,进行SQL注入攻击。目前针对网站的SQL注入是最多的,也是最简单的一种攻击方式,当程序员在设计代码时,没有充分考虑到对用户输入的字符串进行过滤特殊字符,导致用户输入了经过精心编写的一段SQL语句后,就可以完成数据的窃取。
三、代码编写中SQL注入防范
我们在编写代码时要自行分析源代码中的漏洞,主要有两种方法,静态分析和动态分析,静态代码分析是指分析源代码,并不真正执行代码,只是去审核和分析源代码。动态分析是指在代码的运行过程中动态调试的加以分析,找到漏洞。而我们通常结合地使用两种方法用来防范我们的SQL注入攻击。
从不可信任来源收到的数据是容易受到感染,这些函数通常用于执行或涉及数据库的SQL语句,我们在编写此类函数或代码时应格外注意外来不可信任的数据输入,每种程序语言均有很多种不同形式来构造SQL语句,如果程序员没有对输入源,如表单、cookie、post变量等进行筛查或验证,很有可能就存在SQL注入的漏洞。string id=tbx.text; DataTable dt= SqlHelperCs.Execute(“select * from table where id=’”+id+”’”);以上代码就是用户直接将用户控件的输入值动态的传递给了构造SQL语句的函数,并且该语句没有对不可信输入源进行有效验证就被执行,这很容易引发SQL注入漏洞。通常我们需要跟踪变量的初始化来源,并且我们也要密切观察此变量是否中途被修改,所以我们在代码编写时应格外注意用户输入等易感染SQL注入的敏感区域,并使用一定的技巧来避免漏洞的可行性。想要构造有效的SQL注入,必须首先搞清楚当前数据库注入类型是数字还是字符串类型,当SQL注入攻击为数字时,是不需要加入单引号的,而其他类型则是需要使用单引号的。使用带数字值的SQL语句,例如:select * from table where id=1 使用带字符串值的SQL语句则为select * from table where id=’1’ 从SQL注入攻击时,攻击者非常注意的是使用字符串单引号的闭合问题,所以我们在编写代码时,需要将特殊字符输入给过滤掉,特别是单引号,空格之类的特殊输入符号。我们可以将输入的字符进行正则表达式匹配,匹配特殊字符的正则表达式为((?=[\x21-\x7e]+)[^A-Za-z0-9])x21-\x7e]+) [^A-Za-z0-9])。而针对于数字输入,经常以AND 1=1 或 OR 1=1 的形式存在,所以我们又要对连续输入的字符中不能包含SQL关键字为主要鉴别点,屏蔽掉AND或OR或UNION或SELECT等等SQL关键字。
1.领域驱动安全设计方法
领域驱动安全设计方法是一种设计代码的方法,以此设计的方法可以广泛用于典型的SQL注入领域,并且它针对的是一种接收广泛数据输入安全设计方法。大多数的代码编写过程中都會对输入允许使用的字符类型和长度加以限制,但随着程序的不断演化和代码增加,新添加的函数有可能会无意绕过了此类验证,所以我们需要专门为代码编写人员创建简单的模型,用来保证所涉及到此模式时,都能够显示的去表达及检验其有效性。通常我们以用户名和密码举例,用户名需要创建Username类,并且应为public类型,并且在类中,我们对原始输入的用户名变量进行封装,在输入时进行正则表达式的非法输入校验,这样做的好处是无论在代码的任何位置,当我们需要使用到用户名时,都可以使用Username类的对象,由于该类中变量是经过有效性校验的,我们可以认为它是有效性防止了SQL注入的变量,这样做的好处是可以避免重复性的检验逻辑,并且提高了团队安全防范意识,我们只需要对关键输入领域安全做好准入校验即可,这就是领域驱动安全的设计方法,追求公共资源的统一校验。
2、使用存储过程防范注入
数据库的存储过程是应用于数据库的配置层来实现的,可以针对特定的数据库用户及相应表,它会限制攻击者拼凑特殊闭合性字符串,因为只能调用存储过程,按要求传入参数,不符合参数数据库控制层将会阻止并报错。存储过程有助于减少潜在SQL注入攻击,我们可以根据数据库不同的版本,使用不同的存储过程语言来编写存储过程,Oracle的PL/SQL,SQL Server的Transact-SQL,以及MySQL的SQL2003标准。
参考文献:
[1]李博文.浅谈SQL注入漏洞的检测与防范[J].技术与市场,2020,27(11):102-103.
[2]刘建亮,乔兴华.SQL注入攻击与防范之研究[J].科学技术创新,2020(08):24-25.
作者简介:薛凯,男,山东省青岛市,1990年5月,本科,高级系统架构师,软件设计师,青岛市黄岛区人民医院信息中心工作,主要从事软件维护、软件开发
青岛市黄岛区人民医院 信息中心 266400