Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql注入-选择的风险_Sql_Oracle - Fatal编程技术网

sql注入-选择的风险

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

我希望将变量中的用户查询读取为: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))';
  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:并将其作为字符串执行,但是,您不是从表中读取它;您使用的是双表,在其前面加上冒号就是在声明绑定变量,后面的冒号在语法上是无效的。请用一个实际运行并与您的描述匹配的答案回答您的问题,否则我们只能猜测您试图实现的目标。我修复了描述。我修复了描述。现在应该更清楚了。