本文摘自PHP中文网,作者coldplay.xixi,侵删。
推荐(免费):SQL教程
SQL
注入是什么?
看一下百度百科的定义:
啊,好长一大段文字,些许不想看,下面通过一个例子,来说明一下什么是SQL注入
:
新建一个数据库,再建一个表,添加两行数据:
1 2 3 4 |
|
表如下图所示:
再随随便便用JDBC
写个登陆操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
|
测试一下:
可以看到,普通的检验没有任何问题,现在使用SQL注入
:
账户名称随便输入,密码输入:a' or 'a'='a
惊讶的发现,居然登陆成功了。输出一下sql
看一下:
1 |
|
可以看到where
之后的条件,无论是什么结果都为真,都会输出整个表:
所以,综上所述:在sql
拼接时,有一些sql
的特殊关键字参与字符串的拼接,就会造成安全性问题,这就是上面为什么能登陆成功的原因所在。
那怎么解决这个问题呢?
答:利用PreparedStatement
对象,不使用Statement
对象。
PreparedStatement
对象是Statement
对象的子类,它是预编译的sql
,所以运行速度会比Statemnet
更快。
PerpaerdStatement
使用?
作为占位符,使用setXxx(索引,值)
给?
赋值
所以我们替换一下Statement
,写一下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
测试一下:
成功解决!
以上就是解决 SQL 注入问题的详细内容,更多请关注木庄网络博客其它文章!
相关阅读 >>
更多相关阅读请进入《SQL注入》频道 >>
数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。