在SQL SELECT语句中使用quote delimiter来转义单引号

时间:2013-04-23 15:48:53

标签: sql oracle oracle10g

当用户在C#(.NET)开发的表单条目中输入输入文本(例如“Sam的项目可交付成果”)时,我想要单引号。数据库是ORACLE 10g。

我遇到了ORACLE 10g http://www.orafaq.com/wiki/SQL_FAQ#How_does_one_escape_special_characters_when_writing_SQL_queries.3F提供的引用分隔符功能,但我不确定是否使用这样的引号分隔符 q'[带有单引号的某些文字]'作为SELECT语句会阻止SQL注入攻击

引用分隔符q'[带单引号的文本]'的示例用法:

SQL> SELECT q'[Frank's Oracle site]' AS text FROM DUAL;
 TEXT
 -------------------
 Frank's Oracle site

 SQL> SELECT q'[A 'quoted' word.]' AS text FROM DUAL;
 TEXT
 ----------------
 A 'quoted' word.

 SQL> SELECT q'[A ''double quoted'' word.]' AS text FROM DUAL;
 TEXT
 -------------------------
 A ''double quoted'' word.

2 个答案:

答案 0 :(得分:5)

如果您的查询看起来像这样......

query = "SELECT * FROM Users WHERE name = q'[" + <what the user entered> + "]'";

...并且用户输入类似的内容......

abc]';<harmful statement>;SELECT * FROM DUAL WHERE '1'=q'[1

......他们会成功注射。

使用q的分隔符并不重要 - 一个坚定的攻击者会尝试所有分隔符。准备好的陈述是你最好的辩护。

答案 1 :(得分:0)

尝试在执行SQL之前用2个单引号替换所有单引号。即在执行SQL命令之前替换'with'。

在C#中:

string sql = originalString.Replace("'", "''");