清理dbms_sql的sql语句

时间:2014-05-16 23:27:25

标签: oracle sql-injection

具有从表中读取select语句并执行它们的过程。它将结果记录到另一个表中以进行报告。

如果像

那样的话
insert into some table ... 
drop table table_name;

存在于我的查询表中,它可能会对我的数据库造成损害。

这是我的代码的基本替代品。我该如何保护我的数据?

是否有办法限制DBMS_SQL游标只选择语句?

DECLARE
  l_cursor NUMBER DEFAULT DBMS_SQL.OPEN_CURSOR;
  l_cols   NUMBER DEFAULT 0;
  l_desc DBMS_SQL.DESC_TAB;
  v_varchar2 VARCHAR2(4000) ;
  v_log_data VARCHAR2(4000);
  l_status   INTEGER;
BEGIN
  dbms_sql.parse( l_cursor, 'SELECT employee_id, last_name, to_char(hire_date) hire_date FROM EMPloyees where rownum<5', dbms_sql.native );
  l_status := dbms_sql.execute(l_cursor);
  DBMS_SQL.DESCRIBE_COLUMNS( l_cursor, l_cols, l_desc );
  FOR i IN 1 .. l_cols
  LOOP
    DBMS_SQL.DEFINE_COLUMN(l_cursor, i, v_varchar2,4000);
  END LOOP;
  LOOP
    EXIT
  WHEN ( dbms_sql.fetch_rows(l_cursor) <= 0 );
    v_log_data := '';
    FOR i IN 1 .. l_cols
    LOOP
      DBMS_SQL.COLUMN_VALUE(l_cursor, i, v_varchar2);    
      v_log_data :=v_log_data||l_desc(i).col_name || ':' ||v_varchar2||' ';
    END LOOP;
    dbms_output.put_line(v_log_data);
  END LOOP;
  DBMS_SQL.CLOSE_CURSOR(l_cursor);
EXCEPTION
WHEN OTHERS THEN
  DBMS_OUTPUT.PUT_LINE(SQLERRM);
  DBMS_SQL.CLOSE_CURSOR(l_cursor);
END;

0 个答案:

没有答案