防止 Redshift SQL 注入
Preventing Redshift SQL Injection
我有一个不幸的情况,我必须通过连接字符串来构建一个 SQL 字符串——经典的 SQL 注入场景。我不能使用准备好的语句。
如果我转义 '
字符我安全吗?或者还有其他攻击媒介吗?
我正在使用 MyBatis,它是 ${}
表示法(对比 #{}
生成准备好的语句)。我别无选择 - 它必须是${}
。我不能使用准备好的语句。
编辑:
增加一点清晰度;这是一个 ASW Redshift UNLOAD command。 UNLOAD 的第一个参数是 SQL 字符串。
PreparedStatement
(Wikipedia) really is the way to go. In one fell swoop you eliminate a big pile of work and risk regarding SQL Injection 位黑客。
如果你绝对不能't/won使用PreparedStatement
,那么你需要阅读各种策略。您将不得不编写一堆检查来检查和修改您的输入和 SQL。没有silver bullet。 (嗯,实际上,PreparedStatement
是你的灵丹妙药。但没有其他灵丹妙药。)
Google 对于 "sanitize sql input" 这样的项目。您将找到以下资源:
- Bobby-Tables.com(告诉你使用 PreparedStatement)。
- Mitigation section of Wikipedia page on SQL Injection.
- 文章,Prevent Web Attacks Using Input Sanitization。
- 文章 How to prevent SQL injection attacks?,它通过示例解释了清理输入是不够的,并建议使用……是的,您猜对了:
PreparedStatement
。
(由于 Redshift 的限制,您无法以正确的方式进行操作):
在 PostgreSQL 上 standard_conforming_strings
设置为 on
all 你需要做的是双引号,使 '
变成 ''
.而已。
除非 standard_conforming_strings
关闭或您使用 E''
字符串,否则反斜杠并不重要。如果其中任何一个为真,那么您必须转义反斜杠。
由于 Redshift 是基于一个古老的 PostgreSQL 版本的分支,我不确定这如何适用于它。阅读有关其词法结构和语法的文档是明智的,以验证它是否与 PostgreSQL 的工作方式一致。
我有一个不幸的情况,我必须通过连接字符串来构建一个 SQL 字符串——经典的 SQL 注入场景。我不能使用准备好的语句。
如果我转义 '
字符我安全吗?或者还有其他攻击媒介吗?
我正在使用 MyBatis,它是 ${}
表示法(对比 #{}
生成准备好的语句)。我别无选择 - 它必须是${}
。我不能使用准备好的语句。
编辑:
增加一点清晰度;这是一个 ASW Redshift UNLOAD command。 UNLOAD 的第一个参数是 SQL 字符串。
PreparedStatement
(Wikipedia) really is the way to go. In one fell swoop you eliminate a big pile of work and risk regarding SQL Injection 位黑客。
如果你绝对不能't/won使用PreparedStatement
,那么你需要阅读各种策略。您将不得不编写一堆检查来检查和修改您的输入和 SQL。没有silver bullet。 (嗯,实际上,PreparedStatement
是你的灵丹妙药。但没有其他灵丹妙药。)
Google 对于 "sanitize sql input" 这样的项目。您将找到以下资源:
- Bobby-Tables.com(告诉你使用 PreparedStatement)。
- Mitigation section of Wikipedia page on SQL Injection.
- 文章,Prevent Web Attacks Using Input Sanitization。
- 文章 How to prevent SQL injection attacks?,它通过示例解释了清理输入是不够的,并建议使用……是的,您猜对了:
PreparedStatement
。
(由于 Redshift 的限制,您无法以正确的方式进行操作):
在 PostgreSQL 上 standard_conforming_strings
设置为 on
all 你需要做的是双引号,使 '
变成 ''
.而已。
除非 standard_conforming_strings
关闭或您使用 E''
字符串,否则反斜杠并不重要。如果其中任何一个为真,那么您必须转义反斜杠。
由于 Redshift 是基于一个古老的 PostgreSQL 版本的分支,我不确定这如何适用于它。阅读有关其词法结构和语法的文档是明智的,以验证它是否与 PostgreSQL 的工作方式一致。