Jeder ABAP Entwickler steht früher oder später vor der Aufgabe, verschiedenste Arten von Files in ein SAP System zu laden. Das kann ein einfaches Textfile sein, ein komplexes Excel Sheet oder aber auch eine Bilddatei für Produkte oder ähnliches.
Gerade Excel Files und Bild Dateien können immense Gefahren beinhalten. Angefangen von Makroviren bis hin zu versteckten Trojanern in JPEG Dateien ist alles möglich. Aus diesem Grund sollte es für jeden ABAP Entwickler klar sein, dass alle Arten von Upload Files vor dem Ablegen im System, auf Viren zu prüfen sind.
Viren können in der Regel einem SAP System nicht viel anhaben, da die meisten Filetypen vom System nur verwaltet, aber nicht ausgeführt werden. Problematisch können Viren dann werden, wenn Daten aus einem SAP System auf den Rechner eines Users heruntergeladen werden. Aber auch, wenn Daten per Mail an andere Systeme oder Personen verschickt werden.
Aus diesem Grund hat SAP die Möglichkeit geschaffen, bereits vorhandene Virenscanner in die jeweilige SAP Landschaft einzubinden. Zu diesem Thema findet man gerade im SDN eine Reihe von sehr guten Anleitungen und Konfigurationshilfen.
Für den ABAP Entwickler stellt SAP mit der Klasse CL_VSI die notwendigen Funktionen bereit, um auf die Virenscanner Funktionalität relativ einfach zugreifen zu können.
In meinem kleinen Beispiel möchte ich zeigen, wie ein Virenscan in der Praxis aussehen könnte:
*---------------------------------------------------------------------* * Report Y0_VIR_SCAN * *---------------------------------------------------------------------* * * *---------------------------------------------------------------------* REPORT y0_vir_scan. TYPES: ty_xline(1024) TYPE x. DATA: lv_file TYPE string, lv_len TYPE i, lt_data TYPE STANDARD TABLE OF ty_xline, wa_data TYPE ty_xline. DATA: lt_filetable TYPE filetable, wa_filetable TYPE file_table, lv_rc TYPE i. DATA: lv_data TYPE xstring. DATA: obj_scan TYPE REF TO cl_vsi. DATA: lv_scanrc TYPE vscan_scanrc. * Selection screen SELECTION-SCREEN: BEGIN OF BLOCK a WITH FRAME. PARAMETERS: p_prof TYPE vscan_prof-profile. PARAMETERS: p_file TYPE localfile. SELECTION-SCREEN: END OF BLOCK a. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file. PERFORM file_upload_dialog. START-OF-SELECTION. PERFORM upload_data. PERFORM scan_file. END-OF-SELECTION. *---------------------------------------------------------------------* * Form file_upload_dialog *---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM file_upload_dialog. * Show file upload dialog CALL METHOD cl_gui_frontend_services=>file_open_dialog EXPORTING multiselection = abap_false CHANGING file_table = lt_filetable rc = lv_rc EXCEPTIONS file_open_dialog_failed = 1 cntl_error = 2 error_no_gui = 3 not_supported_by_gui = 4 OTHERS = 5. * Get file READ TABLE lt_filetable INTO wa_filetable INDEX 1. MOVE wa_filetable-filename TO p_file. CLEAR: wa_filetable. FREE: lt_filetable. ENDFORM. "file_upload_dialog *---------------------------------------------------------------------* * Form upload_data *---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM upload_data. MOVE p_file TO lv_file. * Upload file CALL METHOD cl_gui_frontend_services=>gui_upload EXPORTING filename = lv_file filetype = 'BIN' IMPORTING filelength = lv_len CHANGING data_tab = lt_data EXCEPTIONS OTHERS = 1. * Build data xstring LOOP AT lt_data INTO wa_data. CONCATENATE lv_data wa_data INTO lv_data IN BYTE MODE. CLEAR: wa_data. ENDLOOP. FREE: lt_data. ENDFORM. "upload_data *---------------------------------------------------------------------* * Form scan_file *---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM scan_file. DATA: lv_scan_text TYPE string. * Create virus scan object CALL METHOD cl_vsi=>get_instance EXPORTING if_profile = p_prof IMPORTING eo_instance = obj_scan EXCEPTIONS configuration_error = 1 profile_not_active = 2 internal_error = 3 OTHERS = 4. * Scan file CALL METHOD obj_scan->scan_bytes EXPORTING if_data = lv_data IMPORTING ef_scanrc = lv_scanrc EXCEPTIONS not_available = 1 configuration_error = 2 internal_error = 3 OTHERS = 4. * Get scan text lv_scan_text = cl_vsi=>get_scanrc_text( lv_scanrc ). * Write message IF lv_scanrc = cl_vsi=>con_scanrc_ok. WRITE: / 'File is clean'. ELSE. WRITE: / 'File was either infected', 'or could not be scanned', 'or was ignored', 'or another problem occurred'. ENDIF. ENDFORM.
Comments are closed.