Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
Oracle select语句的Q quote可防止sql注入_Oracle_Plsql - Fatal编程技术网

Oracle select语句的Q quote可防止sql注入

Oracle select语句的Q quote可防止sql注入,oracle,plsql,Oracle,Plsql,有谁能给我举个例子,说明如何在pl/sql块内的select语句动态sql中使用Q Quote来防止sql注入 非常感谢 感谢替代报价机制仅提供少量的SQL注入攻击保护。它不如绑定变量那样安全,速度也不如绑定变量那么快 下面是一个简单的SQL注入示例: declare v_sql_injection varchar2(100) := 'Not Jon'; v_sql varchar2(32767); v_count number; begin v_sql_inje

有谁能给我举个例子,说明如何在pl/sql块内的select语句动态sql中使用Q Quote来防止sql注入

非常感谢


感谢

替代报价机制仅提供少量的SQL注入攻击保护。它不如绑定变量那样安全,速度也不如绑定变量那么快

下面是一个简单的SQL注入示例:

declare
    v_sql_injection varchar2(100) := 'Not Jon';
    v_sql varchar2(32767);
    v_count number;
begin
    v_sql_injection := 'q''<'||v_sql_injection||'>''';
    v_sql := 'select count(*) from dual where ''Jon'' = '||v_sql_injection;
    dbms_output.put_line(v_sql);
    execute immediate v_sql into v_count;
end;
/
转换后的字符串如下所示:

select count(*) from dual where 'Jon' = q'<Not Jon>'
这将防止简单的攻击:

select count(*) from dual where 'Jon' = q'<Not Jon' or 1=1>'
但它仍然可以被击败:

select count(*) from dual where 'Jon' = q'<Not Jon>' or 1=1 or '1'=q'<1>'
q应该围绕每个变量,以稍微有助于防止恶意输入。更好的方法是使用


但是,这仍然是一种保护系统的糟糕方法。我无法强调使用绑定变量的重要性。

感谢您的示例@Jon,我知道绑定变量提供了更多的安全性,但现在我必须遵循已经采用的模式,以便Q quote可以为我完成这项工作。任何演示如何在pl/sql块中使用Q quote和select语句的示例都将受到高度赞赏。我知道人们先使用Q,然后使用select语句,但不知道具体如何使用?代码在第6行使用了Q,为了包围输入变量,q也应该放在所有select语句的前面,比如说一个包,比如1。。。。对于按E|D从E|u语言顺序中选择不同E|u D的rec,2..“插入到”| | TableName | | |“COLUMNS”| | |“从”| | cTableName;继续下一个评论…“从”cTableName“中选择”vc2PK“WHERE”而不是“从”cTableName“中选择”;4.stmt DBMS_SQL.VARCHAR2S;然后stmst1:=“从dual中选择Something.NextVal到adno;stmt2:='tstr:='| c2PK | | | | TO | CHAR:OLD.| | c2PK | | | |;我对这一切都不熟悉,所以任何建议都将受到高度赞赏。引号语法与防止sql注入攻击无关。它只是用一种潜在的攻击替换另一种攻击。这种替换的攻击是什么类型的?请阅读Jon Heller的最后答案-他给出了一个简单的例子。您能告诉我如何在这个plsql脚本中添加q引号吗,我对pl/sql非常陌生,所以请原谅。stmt2si:=“从所有_表中选择MYTABLENAME”将计数*选择到x中”;stmt2si+1:='其中TABLE_NAME=somevariable,其中ROWNUM=1;这个小脚本是循环的一部分,可以看到我有一个带索引I的stmst2,在括号中。在这个脚本中,我可能在所有表的MYTABLENAME列中都有一个引号