SQL防注入

本文通过一个具体的例子解释了如何通过不当的SQL拼接导致SQL注入漏洞,并介绍了使用PreparedStatement来有效防止SQL注入攻击的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果在业务逻辑中使用了普通的sql拼接方法来查询用户名和密码的话

如果没有在输入加上一些限制,那么就可能被有心之人利用,在sql中拼接上一些语句,然后程序会识别并执行这些语句,从而造成数据库数据泄漏

"select * from Account where username ='"+username+"'"

例如这个语句,如果变量username的值为普通的正常的查询,那么一般就不会出什么问题

例如username=“Jack”

那么拼接后的sql就是

"select * from Account where username ='jack'"

然后就可以执行正常的功能了。

但是要注意,这个sql语句可以通过username变量输入任何的字符串,拼接成sql语句之后可能出现一些意想不到的结果。

例如username=“jack ’ or’*”

那么拼接后的sql语句就是

"select * from Account where username ='jack' OR '*'"

这个sql语句就可以查询出Account表中所有的username;

解决的方法就是使用PrepareStatement来防止注入

PrepareStatement

  1. 首先创建一个PrepareStatement的空指针

    PrepareStatement pst=null;
    
  2. 创建一个sql语句,要插入的变量使用?来进行站位,例如在我这个sql语句中两个变量先用?来代替

    sql=“select * from Account where username=? and password=?”;
    
  3. 然后利用Connection对象来创建PrepareStatement对象

    pst=conn.prepareStatement(sql);
    
  4. 使用PrepareStatement对象的方法来对sql中缺省的? 进行补全。

    pst.setString(1,username);
    pst.setString(2,password);
    
  5. 最后执行这个PrepareStatement对象,注意这里的executeQuery方法中没有填参数

    rs = pst.executeQuery();
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值