Classe para garantir segurança em programação dinâmica
No outro dia encontrei um programa que gerava um comando SQL com base em várias variáveis fixadas no código. Mas, por distracção ou ignorância, a alminha que fez aquilo achou que fazia sentido associar essas variáveis a símbolos de texto. Algo assim:
l_where = 'WHERE a = 3'(001).Escusado será dizer que esta é uma grave falha de segurança porque qualquer Mr. Robot se poderá aproveitar da situação e, recorrendo à ferramenta de tradução, injectar SQL malicioso no programa. Podes aprender e ver mais exemplos de SQL injection no Guru99.
É importante ter sempre presente a segurança quando se trabalha com código dinâmico.
A classe CL_ABAP_DYN_PRG que pode ajudar nisso (e em muito mais). É uma classe cheia de pequenos métodos utilitários que convém conhecer pois podem dar muito jeito quando menos se espera:
CHECK_INT_VALUE
ESCAPE_QUOTES
ESCAPE_QUOTES_STR
QUOTE
QUOTE_STR
CHECK_COLUMN_NAME
CHECK_VARIABLE_NAME
CHECK_TABLE_NAME_STR
CHECK_TABLE_NAME_TAB
CHECK_TABLE_OR_VIEW_NAME_STR
CHECK_WHITELIST_STR
CHECK_WHITELIST_TAB
CHECK_TABLE_OR_VIEW_NAME_TAB
ESCAPE_XSS_XML_HTML
ESCAPE_XSS_JAVASCRIPT
ESCAPE_XSS_CSS
ESCAPE_XSS_URL
CHECK_CHAR_LITERAL
CHECK_STRING_LITERAL
A maior parte dos nomes dos métodos são auto-explicativos mas, se tiveres dúvidas, a classe está razoavelmente bem documentada.
No caso acima referido nenhum destes métodos por si só resolveria o problema. Mas no caso em que se espera um valor tipo:
"'Maria'"…para juntar a um comando SQL, convém garantir que o que lá vem não é algo tipo:
"'Maria'. DELETE MARA WHERE MATNR <> 'João'"E para garantir isso podes usar o método CL_ABAP_DYN_PRG=>ESCAPE_QUOTES(), por exemplo.
O Abapinho saúda-vos.
