黑马程序员技术交流社区

标题: 防止SQL注入时为什么要用"?"或者":列名(:name)"表示? [打印本页]

作者: 黑马-zhangping    时间: 2012-10-20 21:28
标题: 防止SQL注入时为什么要用"?"或者":列名(:name)"表示?
防止SQL注入时为什么要用"?"或者":列名(:name)"表示?
作者: 王威    时间: 2012-10-20 22:30
我说一个例子你就很明白了,
给你一张数据库表,你看下图

有一张表forum_user,里面有username,password这两个字段
表里有两条记录,我现在进行如下查询:
SELECT * FROM `forum_user` where username='asd' and password=' 'or 1 or' '
查询结果是:两条全出来了,是不是感觉很惊奇啊,username和password都没有符合的怎么还可以全都查询出来
这就是成为网站后台“万能钥匙”,接下来就谈谈SQL注入
如果你页面有两个表单一个是用户名一个是密码,你在后台获取这两个参数时进行如下字符串拼接
select * from table where username=' "+username+" '  and password='  "+password+"  '
进行查询时,当别人输入的密码为 'or 1 or'时,就可以吧所有结果都查询出来了,那别人就可以顺利的进入
你的网站后台了。
当你采用防止注入的方式时,如:使用Preparedstatement时,setString方法就会进行字符串的判别,阻止SQL的注入
其他方式的防止SQL注入道理是一样的。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2