java 如何解决SQL注入攻击

问题描述

action=login&start=login&login=a&password=+or1=1%23&user_type=1&page=1 。
被sql注入了怎么解决

原因分析:

提示:
首先,用户的注入语句中,password参数的值是+or1=1%23,解码后应该是" or 1=1#",这显然是一个经典的SQL注入尝试,利用逻辑或使条件永真,注释掉后续的密码验证。参考搜索结果中的例子,比如‌1和‌2提到的万能密码,以及‌3中解释的原理,这会导致SQL查询条件被绕过,从而未授权登录。


解决方案:

一、代码层防御措施
1‌、参数化查询(预编译语句)‌

禁止直接拼接SQL语句,改用占位符绑定参数。例如:
SELECT * FROM users WHERE username = ? AND password = ?
通过数据库驱动自动处理参数类型,避免恶意输入破坏查询结构‌23。

2、输入合法性校验‌

对sql关键字进行过滤如:select,update,delete

@Override
	public ActionClassResultDTO execute(HttpServletRequest request) {
		String password = RequestUtil.getVarStringValue(request,"password");
		password =password.replaceAll(" ","");
		password =password.replaceAll("'","");
		password =password.replaceAll("select","");
		password =password.replaceAll("update","");
		password =password.replaceAll("delete","");
		password =password.replaceAll("union","");
		password =password.replaceAll("or","");
		password =password.replaceAll("and","");
		password =password.replaceAll("like","");
		password =password.replaceAll("1=","");
		password =password.replaceAll("=1","");
		password =password.replaceAll("\\\\","");
	}

二、架构层增强防护
‌1、加密敏感数据‌

密码存储需使用加盐哈希(如盐值+密码经MD5或bcrypt加密),避免明文或可逆加密存储‌4。

2‌、错误信息隐藏‌

禁止返回数据库原生错误(如语法错误、表结构信息),统一返回模糊提示(如“登录失败”)‌

你可能感兴趣的:(java,sql,oracle)