发表于: 2020-10-04 23:38:03

1 1348


今天完成的事情:

遇到的问题:


登录成功,但这个程序有一个bug,用户名随意输,只要密码按照    x' or 'x' = 'x     就可以登入成功


因为有or 1=1,这是恒成立的
那么就会把所有的数据都查出来,而不只是lisi
如果user表里的数据是海量的,比如几百万条,把这个表里的数据全部查出来
会让数据库负载变高,CPU100%,内存消耗光,响应变得极其缓慢

如下图所示会查询所有的数据


可以使用preparedStatement对象来解决sql的注入问题

statement 和 preparedstatement 的区别


出现错误,原因是没有给问号赋值


重新赋值

结论:

PreparedStatement 是一个特殊的Statement对象,如果我们只是来查询或者更新数据的话,最好用PreparedStatement代替Statement,因为它有以下有点:

  • 简化Statement中的操作
  • 提高执行语句的性能
  • 可读性和可维护性更好
  • 安全性更好。 使用PreparedStatement能够预防SQL注入攻击,所谓SQL注入,指的是通过把SQL命令插入到Web表单提交或者输入域名或者页面请求的查询字符串,最终达到欺骗服务器,达到执行恶意SQL命令的目的。注入只对SQL语句的编译过程有破坏作用,而执行阶段只是把输入串作为数据处理,不再需要对SQL语句进行解析,因此也就避免了类似select * from user where name='aa' and password='bb' or 1=1的sql注入问题的发生。

Statement 和 PreparedStatement之间的关系和区别.

  • 关系:PreparedStatement(子类)继承自Statement(父类),都是接口
  • 区别:PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高



“?” 叫做占位符。 

占位符的索引位置从1开始而不是0,

如果填入0会导致

java.sql.SQLException invalid column index异常。

所以如果PreparedStatement有两个占位符,

那么第一个参数的索引时1,

第二个参数的索引是2.


张三减500,李四加500


制造事物,通过错误来学习

张三的执行了,李四的没有执行


使用JDBC控制事物


值没有任何改变,说明程序成功执行了





明天计划的事情: 

上午学数据池,下午学JdbcTemplate。晚上复习




收获:

了解 statement 和 preparedstatement 的区别,占位符传参。学习了JDBC控制事物。学了一下数据池。




返回列表 返回列表
评论

    分享到