SQL 注入与防治


SQL注入问题是web应用应该注意的 top 10 之一安全问题。通过用户输入或第三方恶意输入内容来获取或者修改数据库的内容;为了避免 SQL注入的问题,应该对 SQL 语句的参数进行检查,也可以利用持久层框架限制SQL。
一般由于手动拼接sql语句引起。

1、如何防治SQL注入

防止SQL注入一般有三种方法
1.过滤原则:对用户输入的数据进行判断,用黑名单,或者白名单的方式验证,或者替换危险字符。
2.写数据存储过程:这个还是有一定的风险有可能会有漏网之鱼,还有就是查询太多的话,存储过程也会写的特别的多,但是写存储过程会提高查询的效率,有一定好处。
3.使用参数化查询语句进行查询,原因可见数据库文件夹中的文章 SQL语法1.1部分http://note.youdao.com/noteshare?id=c088f7c685ade3ac630a101b9d9cd7d2

举例

1、参数化查询:
利用PreparedStatement 安全的插入用户输入值。

String sql = "select customer_id, acc_number, branch_id, balance from Accounts"
    + "where customer_id = ?";
  Connection c = dataSource.getConnection();
  PreparedStatement p = c.prepareStatement(sql);
  p.setString(1, customerId);//限制输入参数值类型为String,且无法利用引号拼接
  ResultSet rs = p.executeQuery(sql)); 
String jql = "from Account where customerId = :customerId";
TypedQuery<Account> q = em.createQuery(jql, Account.class)
.setParameter("customerId", customerId);//限制

2、校验参数:
使用集合的contains方法,检查输入值是否在对应的可选值集合中;
利用正则表达式,检查特殊符,采取拒绝服务、忽略特殊符号、转义特殊符号的方式等进行处理;

2、如何控制SQL注入的影响

当无法避免SQL注入时,可以控制被SQL注入引起的危害程度。作为一种良好的安全实践,我们应该始终实现多个防御层。
场景:项目使用的历史遗留代码无法修改,且遗留代码中存在SQL注入隐患。
1、控制数据库账户权限(restrict privilege of account to access database)
2、使用可用的特定于数据库的方法来添加其他保护层。例如,H2数据库有一个会话级选项,可以禁用SQL查询上的所有文字值
3、使用短期凭据(credentials):使应用程序经常轮换数据库凭据; 实现这一点的一个好方法是使用Spring Cloud Vault
4、记录所有内容:如果应用程序存储客户数据,这是必须的; 有许多解决方案可以直接集成到数据库或作为代理,因此在发生攻击时我们至少可以评估损坏
5、使用WAF或类似的入侵检测解决方案:这些是典型的黑名单示例 - 通常,它们带有一个相当大的已知攻击签名数据库,并会在检测到时触发可编程操作。 有些还包括可以通过应用一些检测来检测入侵的in-JVM代理 - 这种方法的主要优点是最终的漏洞变得更容易修复,因为我们将有一个完整的堆栈跟踪可用。

具体可查看该网站
Primary Defensess:
Option 1: Use of Prepared Statements (with Parameterized Queries)
Option 2: Use of Stored Procedures
Option 3: Whitelist Input Validation
Option 4: Escaping All User Supplied Input
Additional Defenses:
Also: Enforcing Least Privilege
Also: Performing Whitelist Input Validation as a Secondary Defense

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值