編集:SQLインジェクションシナリオを処理します。
execute immediate
と入力すると、parameter
が列名として使用されます。
注:すべての行を更新するwhere節なしでupdate文を実行していることを覚えておいてください。
数値の列名は、newvalue
という文字列で渡すこともできません。したがって、それを処理したい場合は、else文の条件を使用し、update文を実行する前に列のデータ型をチェックしてください。
CREATE OR REPLACE PROCEDURE proc12(column_name in varchar2)
IS
v_count integer;
BEGIN
select count(*) into v_count from (select column_name as txt from dual) where regexp_like (txt,'[,|=|;]');
if v_count =0 then
execute immediate 'UPDATE tbl1 SET '||column_name||' = ''newvalue''';
else
dbms_output.put_line('SQL Injection detected. Exiting');
end if;
END;
select * from tbl1;
+------+
| col1 |
+------+
| abc |
| pqr |
| xyz |
+------+
call proc12('col1');
select * from tbl1;
+----------+
| col1 |
+----------+
| newvalue |
| newvalue |
| newvalue |
+----------+
call proc12('balance=10000, col1');
SQL Injection detected. Exiting
したがって、パラメータは更新が必要な列です。すべての列を 'newvalue'としてハードコード化しますか? – Utsav
いいえ@Utsav別のテーブルからその新しい値を選択し、投稿したコードは機能しています!とにかくありがとう:) –