我们必须使用较旧版本的ERP系统(1993)。
它有多个模块。这些模块有窗口(选项卡)。标签页有cols (很明显)。
在此选项卡中,用户可以创建一个类似于子查询的“新列”->。查询只能在括号()中使用。
我只是好奇,有没有可能按用户进行注入。
例如:
--basic query (self join)
(select i.my_col from my_table i where my_pk = i.pk)
--illlustrating
(select replace(i.my_col, 'UPDATE...') from my_table i where my_pk = i.pk)有没有办法让第二个查询变得可行?我的意思是,用户可以用这种方法来更新列吗?
我如何测试它?
发布于 2020-05-05 16:25:24
可以通过preparedStatement和setParameter为where条件处理动态值,但不幸的是,该选项不适用于动态column选择。
可以做的最好的事情是在传递给查询之前拥有所有可能/适用的列名。
// check if my_col is possible values else throw the error.
(select replace(i.my_col, 'UPDATE...') from my_table i where my_pk = i.pk)发布于 2020-05-05 18:15:00
避免SQL注入的原因在于将用户输入转换为可执行语句的机制。您发布的实际示例不会运行,但我可以想出一些方法来劫持SELECT来运行恶意DML。这取决于框架:考虑到底层软件是古老的,我怀疑它可能非常容易受到攻击。
一般来说,如果您担心SQL注入,那么您应该研究一下使用Oracle的内置DBMS_ASSERT package来验证SQL字符串。Find out more
https://stackoverflow.com/questions/61608638
复制相似问题