- 1、本文档共4页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
sql中的安全问题
SQL中的安全问题
在日常开发过程中,程序员一般只关心SQL是否能实现预期的功能,而对于SQL的安全问题一般都不太重视。实际上,如果SQL语句写作不当,将会给应用系统造成很大的安全隐患,其中最重要的隐患就是SQL注入。本章以MySQL为例,将会对SQL注入以及相应的防范措施进行详细的介绍。
SQL注入简介
结构化查询语言SQL)是一种用来和数据库交互的文本语言。SQL Injection就是利用某些数据库的外部接口用户数据插入到实际的数据库操作语言SQL)当中,从而达到入侵数据库乃至操作系统的目的。它的产生主要是由于程序对用户输入的数据没有进行严格的过滤,导致非法数据库查询语句的执行。
SQL注入(SQL Injection)攻击具有很大的危害,攻击者可以利用它读取、修改或者删除数据库内的数据,获取数据库中的用户名和密码等敏感信息,甚至可以获得数据库管理员的权限,而且,SQL Injection也很难防范。网站管理员无法通过安装系统补丁或者进行简单的安全配置进行自我保护,一般的防火墙也无法拦截SQL InjectionSQL注入的一个例子(以PHP程CREATE TABLE user (
userid int(11) NOT NULL auto_increment,
username varchar(20) NOT NULL default ,
password varchar(20) NOT NULL default ,
PRIMARY KEY (userid)
) TYPE=MyISAM AUTO_INCREMENT=3 ;
(2)给用户表user添加一条用户记录:
INSERT INTO `user` VALUES (1, angel, mypass);
(3)验证用户root登录localhost服务器:?php
$servername = localhost;
$dbusername = root;
$dbpassword = ;
$dbname = injection;
mysql_connect($servername,$dbusername,$dbpassword) or die (数据库连接失败);
$sql = SELECT * FROM user WHERE username=$username AND password=$password;
$result = mysql_db_query($dbname, $sql);$userinfo = mysql_fetch_array($result);
if (empty($userinfo))
{
echo 登录失败;} else {
echo 登录成功;}
echo pSQL Query:$sqlp;
?
(4)然后提交如下URL:
/injection/user.php?username=angel or 1=1
结果发现,这个URL可以成功登录系统,但是很显然这并不是我们预期的结果同样也可以利用SQL的注释语句实现SQL/injection/user.php?username=angel/*
/injection/user.php?username=angel#
因为在SQL语句中,“/*”或者“#”都可以将后面的语句注释掉。这样上述语句就可以通过这两个注释符中任意一个将后面的语句给注释掉了,结果导致只根据用户名而没有密码的URL都成功进行了登录。利用“or”和注释符的不同之处在于,前者是利用逻辑运算,而后者则是根据MySQL的特性,SQL注入效果,都是我们应该关注的。
应用开发中可以采取的应对措施
对于上面提到的SQL注入隐患,后果可想而知是很严重的,轻则获得数据信息,重则可以将数据进行非法更改。那么对这种情况有没有防范措施呢?答案是肯定的,本节将介绍一些常用的防范方法。
PrepareStatement+Bind-variable
对Java、JSP开发的应用,可以使用repareStatement+Bind-variable来防止SQL注入另外从PHP 5开始,也在扩展的MySQLI中支持repareStatement,所以在使用这类语言作数据库开发时强烈建议使用repareStatement+Bind-variable来实现而尽量不要使用拼接的SQL,下面以Java…
String sql?=?select?*?from?users?u where?u.id?=???and?u.password?=??;
preparedstatement?ps?=?connection.preparestatement(sql);
ps.setint(1,id);
ps.setstring(2,pwd);
resultset?rs?=?ps.exec
文档评论(0)