Virenscan

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.

Posted on 20. März 2015 in ABAP, Blog

Back to Top