WAARSCHUWING :Dynamische SQL zoals deze is gevoelig voor SQL Injection-aanvallen. Herschrijf waar mogelijk uw dynamische SQL om in plaats daarvan bindvariabelen te gebruiken.
In plaats van uw dynamische SQL als volgt te construeren:
L_SQL := 'UPDATE '||l_prefix||'CRS_CUSTOMERS SET CUSTOMER_SOURCE_REF_ID = '||i.CUSTOMER_REF_ID||' WHERE CUSTOMER_ID = '||i.CUSTOMER_ID;
EXECUTE IMMEDIATE L_SQL;
Gebruik dit:
L_SQL := 'UPDATE '||l_prefix||'CRS_CUSTOMERS SET CUSTOMER_SOURCE_REF_ID = :REF_ID WHERE CUSTOMER_ID = :CUST_ID';
EXECUTE IMMEDIATE L_SQL USING i.CUSTOMER_REF_ID, i.CUSTOMER_ID;
Dit is nog steeds onderhevig aan SQL-injectie op de l_prefix
, maar als u die waarde programmatisch beheert, kan het in orde zijn. Door de constructie van de SQL en de uitvoering van de SQL in twee stappen te splitsen, kunt u de EXECUTE IMMEDIATE
gemakkelijker vervangen met DBMS_OUTPUT.PUT_LINE(SQL);
om uw zoekopdracht op syntaxisfouten te controleren. U kunt ook DBMS_OUTPUT.PUT_LINE
uw parameters i.CUSTOMER_REF_ID
en i.CUSTOMER_ID
om hun waarden te controleren.