sql if语句(我们常见的提交方式有哪些)

精英怪
广告

sql if语句,我们常见的提交方式有哪些?

WEB安全之SQL注入

sql if语句(我们常见的提交方式有哪些)

引言:

在开发网站的时候,出于安全考虑,需要过滤从页面传递过来的字符。通常,用户可以通过以下接口调用数据库的内容:URL地址栏、登陆界面、留言板、搜索框等。这往往给骇客留下了可乘之机。轻则数据遭到泄露,重则服务器被拿下。

1、SQL注入步骤

a)寻找注入点,构造特殊的语句

传入SQL语句可控参数分为两类 1. 数字类型,参数不用被引号括起来,如 2. 其他类型,参数要被引号扩起来,如

b)用户构造SQL语句(如:'or 1=1#;admin'#(这个注入又称PHP的万能密码,是已知用户名的情况下,可绕过输入密码)以后再做解释)

c)将SQL语句发送给DBMS数据库

d)DBMS收到返回的结果,并将该请求解释成机器代码指令,执行必要得到操作

e)DBMS接受返回结果,处理后,返回给用户

因为用户构造了特殊的SQL语句,必定返回特殊的结果(只要你的SQL语句够灵活)

下面,我通过一个实例具体来演示下SQL注入 二、SQL注入实例详解(以上测试均假设服务器未开启magic_quote_gpc)

1) 前期准备工作 先来演示通过SQL注入漏洞,登入后台管理员界面 首先,创建一张试验用的数据表:

CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(64) NOT NULL, `password` varchar(64) NOT NULL, `email` varchar(64) NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `username` (`username`) ) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

添加一条记录用于测试:

INSERT INTO users (username,password,email)VALUES('MarcoFly',md5('test'),'marcofly@test.com');

接下来,贴上登入界面的源代码

<html><head><title>Sql注入演示</title><meta http-equiv="content-type" content="text/html;charset=utf-8"></head><body ><form action="validate.php" method="post"><fieldset ><legend>Sql注入演示</legend><table><tr><td>用户名:</td><td><input type="text" name="username"></td></tr><tr><td>密 码:</td><td><input type="text" name="password"></td></tr><tr><td><input type="submit" value="提交"></td><td><input type="reset" value="重置"></td></tr></table></fieldset></form></body></html>

附上效果图:

当用户点击提交按钮的时候,将会把表单数据提交给validate.php页面,validate.php页面用来判断用户输入的用户名和密码有没有都符合要求(这一步至关重要,也往往是SQL漏洞所在)

! <!--前台和后台对接--><html><head><title>登录验证</title><meta http-equiv="content-type" content="text/html;charset=utf-8"></head><body><?php $conn=@mysql_connect("localhost",'root','') or die("数据库连接失败!");; mysql_select_db("injection",$conn) or die("您要选择的数据库不存在"); $name=$_POST['username']; $pwd=$_POST['password']; $sql="select * from users where username='$name' and password='$pwd'"; $query=mysql_query($sql); $arr=mysql_fetch_array($query);if(is_array($arr)){ header("Location:manager.php"); }else{ echo "您的用户名或密码输入有误,<a href=\"Login.php\">请重新登录!</a>"; } ?></body></html>

注意到了没有,我们直接将用户提交过来的数据(用户名和密码)直接拿去执行,并没有实现进行特殊字符过滤,待会你们将明白,这是致命的。 代码分析:如果,用户名和密码都匹配成功的话,将跳转到管理员操作界面(manager.php),不成功,则给出友好提示信息。 登录成功的界面:

登录失败的提示:

到这里,前期工作已经做好了,接下来将展开我们的重头戏:SQL注入

2) 构造SQL语句 填好正确的用户名(marcofly)和密码(test)后,点击提交,将会返回给我们“欢迎管理员”的界面。 因为根据我们提交的用户名和密码被合成到SQL查询语句当中之后是这样的: select * from users where username='marcofly' and password=md5('test') 很明显,用户名和密码都和我们之前给出的一样,肯定能够成功登陆。但是,如果我们输入一个错误的用户名或密码呢?很明显,肯定登入不了吧。恩,正常情况下是如此,但是对于有SQL注入漏洞的网站来说,只要构造个特殊的“字符串”,照样能够成功登录。

比如:在用户名输入框中输入:' or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为: select * from users where username='' or 1=1#' and password=md5('') 语义分析:“#”在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样就不会去执行了,换句话说,以下的两句sql语句等价:

select * from users where username='' or 1=1#' and password=md5('')

等价于

select* from users where usrername='' or 1=1

因为1=1永远是都是成立的,即where子句总是为真,将该sql进一步简化之后,等价于如下select语句:

select * from users 没错,该sql语句的作用是检索users表中的所有字段

上面是一种输入方法,这里再介绍一种注入的方法,这个方法又称PHP的万能密码

我们再已知用户名的条件下,可以不能密码即可登入,假设用户名:admin

构造语句:

select * from users where username='admin'#' and password=md5('')

等价于

select * from users where username='admin'

这样即可不能输入密码登入上去的。

数据库就会错认为不用用户名既可以登入,绕过后台的验证,已到达注入的目的。

同样利用了SQL语法的漏洞。

看到了吧,一个经构造后的sql语句竟有如此可怕的破坏力,相信你看到这后,开始对sql注入有了一个理性的认识了吧~ 没错,SQL注入就是这么容易。但是,要根据实际情况构造灵活的sql语句却不是那么容易的。有了基础之后,自己再去慢慢摸索吧。 有没有想过,如果经由后台登录窗口提交的数据都被管理员过滤掉特殊字符之后呢?这样的话,我们的万能用户名' or 1=1#就无法使用了。但这并不是说我们就毫无对策,要知道用户和数据库打交道的途径不止这一条。

SQL中EXISTS怎么用?

1、创建一个临时表,用于演示sqlserver语法中的exists使用方式IF OBJECT_ID('tempdb..#tmp1') IS NOT NULL DROP TABLE #tmp1; CREATE TABLE #tmp1( Col1 varchar(50), Col2 varchar(200) )。

2、往临时表中插入几行测试数据,用于演示exists使用insert into #tmp1(Col1, Col2) values('Code1', '1');insert into #tmp1(Col1, Col2) values('Code10', '2');insert into #tmp1(Col1, Col2) values('Code100', '3')。

3、查询临时表中的测试数据select * from #tmp1。

4、如果在exists中查询的结果是NULL,最终exists返回的仍然是true。例如,下面的语句返回的就是整个表的结果select * from #tmp1 where exists(select null)。

5、使用子查询结合exists使用,当exists返回true的时候,就返回指定结果select *from #tmp1where exists(select 1 from #tmp1 where Col2 = 2)and Col1 = 'Code1'。

6、使用子查询结合exists使用,当exists返回false的时候,就不会返回指定的结果。例如,将上面SQL子查询的Col2从等于2,改成等于20select *from #tmp1where exists(select 1 from #tmp1 where Col2 = 20)and Col1 = 'Code1'。

7、在存储过程中,经常会使用exists判断条件是否成立,例如,判断临时表中是否存在记录if exists(select 1 from #tmp1) print 不存在数据'。

对某一表建立一个禁止插入数据的触发器?

CREATE TRIGGER tr_student ON student FOR INSERTASBEGIN IF GETDATE() > CONVERT(DATE, '2013-05-01') BEGIN RAISERROR("2013年5月1日之后不能插入", 16, 1); END;END;上面的语句, SQL 2005 应该是可以的 SQL 2000 就不确定了, 你可以测试一下。

与sql有什么关系吗?

我做了3年多的plsql开发和sql开发,这个问题很典型,我从通俗理解角度说下,以便能快速理解应用吧:

1、PL/SQL是一堆各种各样sql的集合,把他们打成一个程序包,这个程序包运行在服务器上,所以你就知道了,运行在服务器上的数据库后端程序(PL/SQL)运行效率很高。

plsql举例(通俗理解:包含了一堆逻辑的一堆sql,运行在服务器端):

if (day_count = 0) and (day_count_charge = 0) then

select seq_s_checkout_log.nextval into checkoutlog_id from dual;

insert into T_S_CHECKOUT_LOG

values(checkoutlog_id,

substr(to_char(systimestamp(6),'yyyymmddHH24missff6'),0,18),

0,0,1);

select seq_s_checkout_log.nextval into checkoutlog_id from dual;

insert into T_S_CHECKOUT_LOG

values(checkoutlog_id,

substr(to_char(systimestamp(6),'yyyymmddHH24missff6'),0,18),

0,0,2);

end if;

2、sql相对plsql功能单一,比如只执行查询,就执行更新等等。而plsql是一个程序块,里面包含了逻辑判断,比如:如果满足什么条件就执行查询操作,把查询结果赋予一个变量,当变量值达到100后将日志计入日志表等等。

sql举例(通俗理解:只执行插入或者更新,需要传输到服务器端后才能运行):

select max(nextval) from dual;

以上是从通俗案例方面的解释,方便快速理解,感兴趣加关注哦,有很多案例代码可送。也欢迎吐槽拍砖。以下是一个plsql实际案例的业务流程图:

sql提供的控制流有哪些?

t-sql除了提供标准工业数据库操纵语录外还提供了一些控制语句,以便可以写出功能更强大的数据库任务。这其中包含了if判断、while循环、select多选分支等

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
评论列表 (暂无评论,163人围观)

还没有评论,来说两句吧...