SQL的Statement注入
当用户输入的查询条件里含有sql的关键字时:
String name1 ="'or 1 or '";
String sql = "SELECT name,owner FROM pet WHERE name ='"+name1+"'";//拼串方式
则替换后的sql语句变为:
SELECT name,owner FROM pet WHERE name =''or 1 or '';
则where后的条件恒为真,会选出所有的记录,造成数据库的不安全
解决方案:
将以下代码:
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT name,owner FROM pet WHERE name ="+name1+"");
替换为:
String sql = "SELECT name,owner FROM pet WHERE name=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,name1); //表示将第一个问号替换成name1;
rs = ps.executeQuery();//没有参数,PreparedStatement继承自Statement重载executeQuery()没有参数
当sql语句没有查询条件(增删改查)或者查询条件固定时可以用Statement,sql语句带String参数时要用PreparedStatement,它会对sql语句里的特殊字符进行预处理。