sql注入-选择的风险
我希望将变量中的用户查询读取为:user\u query:并执行它-在Oracle中,它将类似于:sql注入-选择的风险,sql,oracle,Sql,Oracle,我希望将变量中的用户查询读取为:user\u query:并执行它-在Oracle中,它将类似于: DECLARE ddl_qry CLOB; user_query VARCHAR2(20) := 'SELECT 100 FROM dual'; BEGIN ddl_qry := 'INSERT INTO a (v) VALUES ((SELECT CAST(( ' || user_query || ') AS NUMBER) as COUNTER FROM dual))'; E
DECLARE
ddl_qry CLOB;
user_query VARCHAR2(20) := 'SELECT 100 FROM dual';
BEGIN
ddl_qry := 'INSERT INTO a (v) VALUES ((SELECT CAST(( ' || user_query || ') AS NUMBER) as COUNTER FROM dual))';
EXECUTE IMMEDIATE ddl_qry;
END;
我需要将用户查询的结果插入表“a”
我不在乎它是否会失败,但这安全吗如果字符串用户使用SQL查询将删除我的数据库或执行其他操作,是否有任何选项
或者sb可以构造一个查询来删除我的数据库
如果我们修复PL/SQL块中的许多语法错误,我们将得出:
声明
ddl_qry CLOB;
用户_query VARCHAR220:=“1024”;
开始
ddl_qry:='插入v值选择强制转换:用户_查询为数字作为双精度计数器';
使用用户查询执行即时ddl;
终止
/
它可以工作,并且不存在SQL注入漏洞,因为它使用绑定变量:user\u query来输入值
然而,这并不意味着它特别适合你:
不需要使用动态SQL;
不需要从双表中选择;和
不需要显式地将输入转换为数字,因为如果要插入的列是数字,则将存在隐式转换。
因此,上述代码可以简化为:
声明
用户_query VARCHAR220:=“1024”;
开始
在v值用户查询中插入;
终止
/
仍然没有SQL注入漏洞,查询更简单
小提琴
使现代化
在Oracle中,它将类似于:
DECLARE
ddl_qry CLOB;
user_query VARCHAR2(20) := 'SELECT 100 FROM dual';
BEGIN
ddl_qry := 'INSERT INTO a (v) VALUES ((SELECT CAST(( ' || user_query || ') AS NUMBER) as COUNTER FROM dual))';
EXECUTE IMMEDIATE ddl_qry;
END;
声明
ddl_qry CLOB;
用户_query VARCHAR220:=“从双精度中选择100”;
开始
ddl_qry:='插入v值选择强制转换'| | |用户| | |'作为双精度计数器的数字';
执行即时ddl_qry;
终止
它具有巨大的SQL注入漏洞
如果用户查询设置为:
选择案例
何时存在
选择1
来自用户
其中username='Admin'
密码\u散列=标准\u散列'my$ecretPassw0rd','SHA256'
然后100
其他0
终止
来自双重
如果得到值100,则您知道:
有一个名为users的表;
它有用户名和密码列\u散列;
有一个管理员用户;和
你已经验证了他们的密码。
如果不需要,请不要使用动态SQL和字符串连接。我希望将表中的用户查询读取为:user\u query:并将其作为字符串执行,但是,您不是从表中读取它;您使用的是双表,在其前面加上冒号就是在声明绑定变量,后面的冒号在语法上是无效的。请用一个实际运行并与您的描述匹配的答案回答您的问题,否则我们只能猜测您试图实现的目标。我修复了描述。我修复了描述。现在应该更清楚了。