具有主机变量的静态语句不容易受到SQL注入攻击。
非参数化动态语句,你需要担心...... 他们会看起来像等什么:(我的COBOL生锈)
STRING "INSERT INTO TBL (a,b,c) VALUES ("
X ", "
Y ", "
Z ")" INTO WSQLSTMT.
EXEC SQL PREPARE MYSTMT FROM :WSQLSTMT END-EXEC.
EXEC SQL EXECUTE MYSTMT END-EXEC.
注意,你可以使用EXECUTE IMMEDIATE,到位两个步骤的PREPARE和EXECUTE
与此相反,一个参数化的动态查询看起来像:
STRING "INSERT INTO TBL (a,b,c) VALUES (?, ?, ?)" INTO WSQLSTMT.
EXEC SQL PREPARE MYSTMT FROM :WSQLSTMT END-EXEC.
EXEC SQL EXECUTE MYSTMT USING :X, :Y, :Z END-EXEC.
总之,为static使用像你这样的主机变量进行查询的原始发布是安全的,因为它是一个参数化的动态查询。直接使用用户输入构建要执行的SQL语句的非参数化查询不安全。
要理解的关键是在变量的运行时间值发挥作用之前,语句必须事先编译(准备好)。在你最初的静态语句中,语句是在编译时自动准备的。
注意,由于静态语句是在编译时准备的,因此它比在运行时准备的动态语句更好。因此,尽可能使用静态语句通常是最好的。
非常感谢。只是要更加确定 - :x,:y和:z会是动态的,因为它们来自用户输入。所以只想检查一下主机变量中的值是否会影响查询,例如通过包含引号和注释字符。 – user3374881
否 - 动态SQL是在将字符串传递给数据库之前连接字符串的位置。如果_those_连接的字符串包含用户输入,那么就搞砸了。 (好吧,有一些“安全”类型或方式可以引用其他类型,但通常使用参数/主机变量会更好/更容易)。 –