论文部分内容阅读
摘要本文通过一段JAVA代码引入SQL注入问题,对SQL注入概念和问题作了详细介绍,并给出了解决该问题的方法,最后对如何避免SQL注入问题作了总结。
关键词MYSQLSQL注入方法
中图分类号:TP31文献标识码:A
1 引言
Statement用于执行静态 SQL 语句并返回它所生成结果的对象。用Statement来处理SQL语句时,可能会产生SQL注入问题,请看如下代码:
当我们调用read1(name),且name为数据库中存在的用户名,就能打印出正确的用户信息,反之则显示该用户不存在的信息。但是当我们尝试调用read1( or 1 or )时,就会把数据库中所有用户显示都打印出来,显然这不是我们希望看到的。为什么会出现这种情况呢?我们来分析一下SQL语句:select id, name, money, birthdayfrom user where name=" or 1 or ";其中的where name=" or 1 or "表示只要name不为0就满足条件,所有条件都符合记录,相当于没有任何限制了,这种方式实际上是很不安全的,以上情况就属于SQL注入问题之一。
2 相关概念
所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.
当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造(或者影响)动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。
3 解决方法
用继承于Statement的PreparedStatement可解决SQL注入的问题,SQL 语句被预编译并存储在 PreparedStatement 对象中,然后可以使用此对象多次高效地执行该语句。下面为改进后的代码:
由于PreparedStatement处理SQL语句时,它首先对语句中的一些特殊字符进行预处理或者过滤,包括对一些性能进行了优化,所以PreparedStatement能解决SQL注入问题。
PreperedStatement(从Statement继承扩展而来)相对Statement的优点:
①不存在SQL注入的问题。
②Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。
③数据库和驱动可以对PreperedStatement进行优化(只有在相关联的数据库连接没有关闭的情况下有效)。
4结论
一般情况下,对于没有条件或者条件固定的SQL语句,可以用Statement来处理。但绝大多数情况下,只要带有参数的特别是String类型参数的SQL语句,在处理时一定要用PreparedStatement来处理,这样就可以解决SQL注入问题。
关键词MYSQLSQL注入方法
中图分类号:TP31文献标识码:A
1 引言
Statement用于执行静态 SQL 语句并返回它所生成结果的对象。用Statement来处理SQL语句时,可能会产生SQL注入问题,请看如下代码:
当我们调用read1(name),且name为数据库中存在的用户名,就能打印出正确的用户信息,反之则显示该用户不存在的信息。但是当我们尝试调用read1( or 1 or )时,就会把数据库中所有用户显示都打印出来,显然这不是我们希望看到的。为什么会出现这种情况呢?我们来分析一下SQL语句:select id, name, money, birthdayfrom user where name=" or 1 or ";其中的where name=" or 1 or "表示只要name不为0就满足条件,所有条件都符合记录,相当于没有任何限制了,这种方式实际上是很不安全的,以上情况就属于SQL注入问题之一。
2 相关概念
所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.
当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造(或者影响)动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。
3 解决方法
用继承于Statement的PreparedStatement可解决SQL注入的问题,SQL 语句被预编译并存储在 PreparedStatement 对象中,然后可以使用此对象多次高效地执行该语句。下面为改进后的代码:
由于PreparedStatement处理SQL语句时,它首先对语句中的一些特殊字符进行预处理或者过滤,包括对一些性能进行了优化,所以PreparedStatement能解决SQL注入问题。
PreperedStatement(从Statement继承扩展而来)相对Statement的优点:
①不存在SQL注入的问题。
②Statement会使数据库频繁编译SQL,可能造成数据库缓冲区溢出。
③数据库和驱动可以对PreperedStatement进行优化(只有在相关联的数据库连接没有关闭的情况下有效)。
4结论
一般情况下,对于没有条件或者条件固定的SQL语句,可以用Statement来处理。但绝大多数情况下,只要带有参数的特别是String类型参数的SQL语句,在处理时一定要用PreparedStatement来处理,这样就可以解决SQL注入问题。