Classe para garantir segurança em programação dinâmica
![images/thumbnail.jpg - Thumbnail](/2017/07/classe-garantir-seguranca-programacao-dinamica/images/thumbnail_hu8bd2c37348571e0778a746b209694bd2_59703_300x0_resize_q75_box.jpg)
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.