■新疆 崔良义
随着信息技术的不断发展,网络信息安全问题日益突出。本文阐述了SQL 注入对应用程序的安全隐患,最后提出了一些有效的防御措施。
SQL 注入,存在于大多数具有数据库且带有参数的网站中,具有隐蔽性,危害性极大等特点。攻击者往往通过不断尝试寻找注入点,然后构造恶意SQL 语句,将语句发送给数据库管理系统,从而达到非法查看或修改数据的目的。例如,假设已发现网站www.test.com/index.php?id=1 存在SQL 注入,通过order by 来猜测数据库的字段数,当字段数等于3 时数据库返回错误信息,那么,我们可以进一步查询出数据库的隐私信息。
显然,SQL 注入产生的主要原因就是未经检查的用户输入数据,被恶意构造成了可执行的代码,产生了开发者预期之外的动作。因而,我们可以从以下几方面加强预防。
图1 采用SQL 语句预编译和绑定变量
通过使用WAF 等专业的防护软件系统过滤用户输入的非法参数。例如,union、and、insert、select、delete、update、mid、or、#等关键字符串的过滤,确保用户输入数据的合法性,这样就可以尽可能的防御SQL注入语句的输入。
攻击者为了找到SQL 注入点,通常会通过输入非法字符串来获取服务器返回的报错信息。如果目标Web 网站开启了默认错误显示,攻击者就可通过查看页面的错误信息推测出Web网站使用的数据库和开发语言等重要信息。因此,程序员应关闭Webserver 错误提示,或自定义错误页面。对于PHP页面,可将配置文件php.ini中的display_errors 设置为Off 即可关闭错误提示。
例如,采用Prepared Statement 将 SQL 语句“select id,name from user where id=1”预先编译好,即通过SQL 引擎预先进行语法分析,产生语法树,生成执行计划;这样后面无论你输入什么参数,都不会影响该SQL语句的语法结构了,执行代码如图1 所示。
做好数据库账号和权限的管理,并严格加密处理用户的机密信息,防止泄露。对用户输入的数据进行加密处理,再跟数据库中数据比较,从而防止被SQL注入。
SQL 注入是当前普遍使用的一种Web 攻击手段,一旦被黑客注入成功,轻则造成非法获取数据库信息,重则直接篡改数据库内容,甚至破坏程序文件造成服务器宕机,给企业带来巨大损失。
因此,作为一名合格的程序员,应在编写程序代码时,严格做好SQL 注入防御措施,并建议企业采购专业的服务器漏洞扫描工具及WAF 等防护软件,从而为服务器多增加一层安全防范堡垒。