防止 SQL 注入 · OpenResty

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 防止 SQL 注入 · OpenResty

防止 SQL 注入

所谓 SQL 注入,就是通过把 SQL 命令插入到 Web 表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令。具体来说,它是利用现有应用程序,将(恶意)的 SQL 命令注入到后台数据库引擎执行的能力,它可以通过在 Web 表单中输入(恶意)SQL 语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行 SQL 语句。比如先前的很多影视网站泄露 VIP 会员密码大多就是通过 Web 表单递交查询字符暴出的,这类表单特别容易受到 SQL 注入式攻击。

+

SQL 注入例子

下面给了一个完整的可复现的 SQL 注入例子,实际上注入的 SQL 语句写法有很多,下例是比较简单的。

 location /test {

content_by_lua_block {

localmysql =require"resty.mysql"

localdb, err = mysql:new()

ifnotdbthen

ngx.say("failed to instantiate mysql: ", err)

return

end


db:set_timeout(1000)-- 1 sec


localok, err, errno, sqlstate = db:connect{

host ="127.0.0.1",

port =3306,

database ="ngx_test",

user ="ngx_test",

password ="ngx_test",

max_packet_size =1024*1024}


ifnotokthen

ngx.say("failed to connect: ", err,": ", errno," ", sqlstate)

return

end


ngx.say("connected to mysql.")


localres, err, errno, sqlstate =

db:query("drop table if exists cats")

ifnotresthen

ngx.say("bad result: ", err,": ", errno,": ", sqlstate,".")

return

end


res, err, errno, sqlstate =

db:query("create table cats "

.."(id serial primary key, "

.."name varchar(5))")

ifnotresthen

ngx.say("bad result: ", err,": ", errno,": ", sqlstate,".")

return

end


ngx.say("table cats created.")


res, err, errno, sqlstate =

db:query("insert into cats (name) "

.."values (\'Bob\'),(\'\'),(null)")

ifnotresthen

ngx.say("bad result: ", err,": ", errno,": ", sqlstate,".")

return

end


ngx.say(res.affected_rows," rows inserted into table cats ",

"(last insert id: ", res.insert_id,")")


-- 这里有 SQL 注入(后面的 drop 操作)

localreq_id =[[1'; drop table cats;--]]

res, err, errno, sqlstate =

db:query(string.format([[select * from cats where id = '%s']], req_id))

ifnotresthen

ngx.say("bad result: ", err,": ", errno,": ", sqlstate,".")

return

end


localcjson =require"cjson"

ngx.say("result: ", cjson.encode(res))


-- 再次查询,table 被删

res, err, errno, sqlstate =

db:query([[select * from cats where id = 1]])

ifnotresthen

ngx.say("bad result: ", err,": ", errno,": ", sqlstate,".")

return

end


db:set_keepalive(10000,100)

}

}

 

其他变种,大家可以自行爬行搜索引擎了解。

OpenResty 中如何规避

其实大家可以大概网络爬行一下看看如何解决 SQL 注入,可以发现实现方法很多,比如替换各种关键字等。在 OpenResty 中,其实就简单很多了,只需要对输入参数进行一层过滤即可。

对于 MySQL ,可以调用 ndk.set_var.set_quote_sql_str ,进行一次过滤即可。

 -- for MySQL

localreq_id =[[1'; drop table cats;--]]

res, err, errno, sqlstate =

db:query(string.format([[select * from cats where id = %s]],

ndk.set_var.set_quote_sql_str(req_id)))

ifnotresthen

ngx.say("bad result: ", err,": ", errno,": ", sqlstate,".")

return

end

 

如果恰巧你使用的是 PostgreSQL ,调用 ndk.set_var.set_quote_pgsql_str 过滤输入变量。读者这时候可以再次把这段代码放到刚刚的示例代码中,如果您可以得到下面的错误,恭喜您,以正确的姿势防止 SQL 注入。

 bad result: You have an error in your SQL syntax; check the manual that

corresponds to your MySQL server version for the right syntax to use near

'1\'; drop table cats;--''' at line 1: 1064: 42000.

 

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
15小时前
|
SQL 安全 前端开发
SQL注入基础
SQL注入基础
8 2
|
2天前
|
SQL Java 关系型数据库
Java与数据库连接技术JDBC关键核心之PreparedStatement以及SQL注入演示解决和原理
Java与数据库连接技术JDBC关键核心之PreparedStatement以及SQL注入演示解决和原理
7 0
|
7天前
|
SQL 监控 安全
代码审计-PHP原生开发篇&SQL注入&数据库监控&正则搜索&文件定位&静态分析
代码审计-PHP原生开发篇&SQL注入&数据库监控&正则搜索&文件定位&静态分析
|
8天前
|
SQL 数据库
sql注入方式
sql注入方式
9 0
|
8天前
【干货】sql-labs、请求方式、注入类型、拼接方式
【干货】sql-labs、请求方式、注入类型、拼接方式
8 0
|
8天前
|
SQL 开发框架 安全
【干货】如何判断 Sql 注入点
【干货】如何判断 Sql 注入点
12 1
|
8天前
|
SQL Web App开发 前端开发
【less-11】基于SQLI的POST字符型SQL注入
【less-11】基于SQLI的POST字符型SQL注入
19 2
|
8天前
|
SQL Web App开发 安全
【less-1】基于SQLI的SQL字符型报错注入
【less-1】基于SQLI的SQL字符型报错注入
14 2
|
8天前
|
SQL 安全 PHP
基于PHPCMS的SQL注入(Havij)
基于PHPCMS的SQL注入(Havij)
15 1
|
11天前
|
SQL 安全 Java
Spring Boot中的跨站点脚本攻击(XSS)与SQL注入防护
【6月更文挑战第15天】在现代Web应用程序开发中,安全性是一个至关重要的课题。跨站点脚本攻击(XSS)和SQL注入是最常见的两种攻击类型,它们可以严重威胁到应用程序的安全。
56 0