SQL防注入规范

什么是SQL注入攻击

参见 [百度百科解释](百度百科-验证)

SQL注入攻击可能会给我们的系统造成什么伤害?

  • 对我们的 MetaDB 造成伤害;通过对我们 MetaDB 查询等语句的 SQL 注入,窃取或攥改我们的 MetaDB。MetaDB 是我们的核心管控信息,想见伤害是可以是致命的。
  • 对我们的用户数据库造成伤害, 甚至通过数据库获取主机操作权限;由于我们的管控系统会通过 super/root 权限来管控用户数据库,黑客通过他购买的 DB 实例提交一些看似“合法”的操作,达到以我们的 super/root 权限来执行它的恶意非法指令,以窃取同主机其他客户的数据,甚至注入恶意程序。这个场景在过去安全组织的 “蓝军演练” 中确实发现过我们系统的漏洞(已修复)。

SQL防注入编码实践

  • 参数校验
    • 不要相信外部输入的参数, 提前在处理业务逻辑之前就需要校验参数的有效性. 要防止恶意用户通过表单、API参数等方式注入恶意代码,那么 “防注入” 的第一层防御就是对参数的有效性校验;比如我们的 CreateDB 接口,需要检查参数 DB 名要符合一定的命名规则,以防止恶意用户在 DB 名中注入恶意指令;
  • SQL 防注入编码实践 - 避免 SQL 直接拼接
    • SQL 拼接是指代码中把 SQL 指令和用户输入参数拼接后形成完整的 SQL 提交 DB 执行。这是我们非常容易引入 "SQL注入"" 风险的不良编码习惯;一旦在 "参数校验" 的第一层防护没有挡住,SQL拼接就直接给了恶意客户达成目的的机会。比如,用户提交 DB 创建请求后,我们如下方式拼接 SQL 语句:
sqlstr = "create database %s" % dbname
curs.execute(sqlstr)

     那么一旦黑客在 dbname 中注入恶意代码,比如 myname;xxxx.evilcode,则黑客就成功地利用我们系统执行 SQL 的 super 权限,成功地执行了它的恶意代码。

           各种语言或者框架都有解决上述需求,使用对应工具前, 应该认真阅读防止 SQL 注入部分使用文档, 避免SQL拼接的方式。

  • Python建议方案
    • 直接使用 MySQLdb/pymysql:
# 传入参数元组进行参数绑定, 而不是直接拼接字符串
sqlstr = "create database %s" 
curs.execute(sqlstr, (dbname,))
    • 一般 ORM(比如 SQLAlchemy) 默认就会使用入参转义功能来防止 SQL 注入, 在使用对用 ORM 的时候请注意查阅对应的使用说明文档
  • Java建议方案
    • 对于直接使用 JDBC 的场景
// 使用 PreparedStatment, 通过 SQL 字符串模板设置参数
PreparedStatment pstmt = conn.prepareStatement("SELECT * FROM user WHERE login=? AND pass=?");
pstmt.setString(1, name);
pstmt.setString(2, pass);
ResultSet rs = pstmt.executeQuery(sql);
    • Mybatis / Ibatis
      • 两种框架类似, 支持两种参数符号, 一种是#,另一种是$. 其中使用 # 会创建一个预编译语句, 使用 $ 会直接和字符串拼接. 所以一般情况下都需要使用 #, 下面以 Mybatis 为例:
<select id="selectPerson" parameterType="int" resultType="hashmap">
  SELECT * FROM PERSON WHERE ID = #{id}
</select>
      • 对于 order by 字段、表名等,是无法使用预编译语句的。这种场景极易产生SQL注入。推荐开发在Java层面做映射,设置一个字段/表名数组,仅允许用户传入索引值。这样保证传入的字段或者表名都在白名单里面
      • like 参数防注入
like concat('%',#{title}, '%')
      • in 之后参数防注入
id in
<foreach collection="ids" item="item" open="("separator="," close=")">
    #{item} 
</foreach>
    • hibernate 使用 positional parameter 或者 named paramete

相关资料

sql注入基础原理(超详细) - 简书

SQL Injection: Defense in Depth - Simple Talk

Thwarting SQL Injection: Defense in Depth | Qualys Security Blog

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值