您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

解决 SQL 注入问题

2024/12/7 12:02:52发布20次查看
推荐(免费):sql教程
sql注入是什么?
看一下百度百科的定义:
啊,好长一大段文字,些许不想看,下面通过一个例子,来说明一下什么是sql注入:
新建一个数据库,再建一个表,添加两行数据:
use db1;create table user( id int primary key auto_increment, username varchar(32), password varchar(32));insert into user values(null,'zhangsan','123');insert into user values(null,'lisi','234');
表如下图所示:
再随随便便用jdbc写个登陆操作:
package com.wzq.jdbc;import com.wzq.util.jdbcutils;import java.sql.connection;import java.sql.resultset;import java.sql.sqlexception;import java.sql.statement;import java.util.scanner;/* *   需求: *       1、通过键盘录入用户名和密码 *       2、判断用户是否登陆成功 * */public class jdbcdemo05 {    public static void main(string[] args) {        scanner cin = new scanner(system.in);        system.out.println(请输入用户名:);        string username = cin.nextline();        system.out.println(请输入密码:);        string password = cin.nextline();        boolean res = new jdbcdemo05().login(username, password);        if (res) system.out.println(登陆成功!);        else system.out.println(登陆失败!);    }    public boolean login(string username, string password) {        if (username == null || password == null) {            return false;        }        connection conn = null;        statement stmt = null;        resultset rs = null;        try {            //1、获取数据库连接            conn = jdbcutils.getconnection();   //jdbcutils工具类            //2、定义sql            string sql = select * from user where username = ' + username + ' and password = ' + password + ';            //3、获取执行sql的对象            stmt = conn.createstatement();            //4、执行sql            rs = stmt.executequery(sql);            return rs.next();        } catch (sqlexception e) {            e.printstacktrace();        } finally {            jdbcutils.close(rs, stmt, conn);        }        return false;    }}
测试一下:
可以看到,普通的检验没有任何问题,现在使用sql注入:
账户名称随便输入,密码输入:a' or 'a'='a
惊讶的发现,居然登陆成功了。输出一下sql看一下:
select * from user where username = 'askjdhjksahd' and password = 'a' or 'a' = 'a'
可以看到where之后的条件,无论是什么结果都为真,都会输出整个表:
所以,综上所述:在sql拼接时,有一些sql的特殊关键字参与字符串的拼接,就会造成安全性问题,这就是上面为什么能登陆成功的原因所在。
那怎么解决这个问题呢?
答:利用preparedstatement对象,不使用statement对象。
preparedstatement对象是statement对象的子类,它是预编译的sql,所以运行速度会比statemnet更快。
perpaerdstatement使用?作为占位符,使用setxxx(索引,值)给?赋值
所以我们替换一下statement,写一下代码:
    public boolean login(string username, string password) {        if (username == null || password == null) {            return false;        }        connection conn = null;        preparedstatement pstmt = null;        resultset rs = null;        try {            //1、获取数据库连接            conn = jdbcutils.getconnection();   //jdbcutils类            //2、定义sql            string sql = select * from user where username = ? and password = ?;            //3、获取执行sql的对象            pstmt = conn.preparestatement(sql);            pstmt.setstring(1,username);            pstmt.setstring(2,password);            //4、执行sql            rs = pstmt.executequery();            return rs.next();        } catch (sqlexception e) {            e.printstacktrace();        } finally {            jdbcutils.close(rs, pstmt, conn);        }        return false;    }
测试一下:
成功解决!
以上就是解决 sql 注入问题的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product