繁体   English   中英

为了避免SQL注入,Oracle SQL中需要转义哪些字符?

[英]What are the characters that need to be escaped in Oracle SQL to avoid SQL Injection?

只想确认在Oracle SQL中需要转义哪些字符以避免SQL注入? 到目前为止,我只发现这篇文章似乎可以回答我的问题: https : //ss64.com/ora/syntax-escape.html 然而,正如我一声,双耳罐“@”字符也需要转义,因此,我认为上面的文章有需要转义字符不完整的清单。 如果有人可以指出需要转义的Oracle SQL中字符的完整列表,那么将不胜感激。

[TL; DR]不要尝试通过转义字符来防止SQL注入; 相反,请勿使用动态SQL或通过字符串串联生成查询,而应使用正确参数化的查询。


链接的页面不是要转义动态SQL,而是要处理在文字中具有特殊含义的字符(在某些情况下,仅适用于用户界面的子集)。

如果您有字符串文字,那么可以通过在字符串周围使用单引号'定义,如果要在字符串文字中使用单引号,则需要使用第二个单引号对单引号进行转义。

SELECT 'The woman''s hat blew off in the wind.' FROM DUAL

在SQL * Plus用户界面中,可以设置LIKE查询中使用的转义字符,以便可以匹配%_字符,否则这些字符在文字中将被视为通配符:

SET ESCAPE '\';
WITH data ( value ) AS (
  SELECT 'abc%def' FROM DUAL UNION ALL
  SELECT 'abcdef'  FROM DUAL
)
SELECT * FROM data WHERE value LIKE '%\%%';

但是,您可以在查询中指定相同的内容(在所有用户界面中有效,而不仅限于SQL * Plus):

WITH data ( value ) AS (
  SELECT 'abc%def' FROM DUAL UNION ALL
  SELECT 'abcdef'  FROM DUAL
)
SELECT * FROM data WHERE value LIKE '%\%%' ESCAPE '\';

他们提到的第三件事是& ,用于替换变量。 许多用户界面不支持替换变量,因此这仅是那些有限的用户界面所关心的。

这是有效的SQL语句:

SELECT 'A&B' FROM DUAL

但是,在SQL * Plus中,“& &表示替换变量的开始,而要忽略它,您需要执行以下任一操作:重新定义替换变量的开始字符; 逃脱那个角色; 或关闭扫描替代变量。


为了避免SQL注入,Oracle SQL中需要转义哪些字符?

所有字符在SQL中均有效。 SELECT '&@()''"%' FROM DUAL是有效的语句。它是否会导致SQL注入问题取决于它们发生的位置。

但是,正如我所听到的,“&”字符也需要转义

仅当用户界面支持替换变量时才将&字符转义,然后仅在您希望防止将其用作替换变量时才需转义。 在其他SQL用户界面中,它没有特殊含义。

@字符不需要在SQL中转义。

一般来说:

  • 不要尝试转义字符以防止SQL注入。
  • 不要通过连接字符串来构建查询。
  • 使用参数化查询并将值作为绑定变量传递给它们。
  • 如果必须动态提供模式/表/列名称,请使用DBMS_ASSERT验证那些对象标识符(并将所有其他值作为绑定变量传递)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM