底层原理通过传递参数(or 1=1 )拼接的SQL语句 导致其成立可以查询到数据。
登录SQL语句:
select * from shs_users where name=‘1’ and pwd=‘12’;
但黑客传递的参数 ’ or 1=‘1
select * from shs_users where name=’’ and pwd=‘’ or 1=‘1’;
解决办法:
使用PreparedStatemnet(预编译执行者对象),将sql语句进行提前编译,明确SQL语句的格式后,传递的参数就是参数,不会拼接sql语句。
用?占位符赋值的方式 setxxx(参数1,参数2)
xxx: 数据类型
参数1:?的位置从编号1开始
参数2:?的实际参数
String loginSql = "select * from shs_users where name=? and pwd=?;";
statement = connection.prepareStatement(loginSql);
statement.setString(1, userEntity.getPhone());
statement.setString(2, userEntity.getPwd());