{"id":94,"date":"2010-02-18T22:04:57","date_gmt":"2010-02-18T21:04:57","guid":{"rendered":"http:\/\/www.pmannel.de\/wordpress\/?p=94"},"modified":"2010-09-16T22:08:45","modified_gmt":"2010-09-16T20:08:45","slug":"dateien-mit-clamav-und-java-scannen","status":"publish","type":"post","link":"https:\/\/www.pmannel.de\/wordpress\/?p=94","title":{"rendered":"Dateien mit ClamAV und Java scannen"},"content":{"rendered":"<p>Kleines Beispiel, wie man auf dem Server Dateien beim Upload auf Viren \u00fcberpr\u00fcfen kann:<\/p>\n<p>Das Scanner-Interface:<\/p>\n<pre class=\"brush:java\">\r\npublic interface Scanner\r\n{\r\n\tScannerResults scan(File source);\r\n}\r\n\r\n<\/pre>\n<p>Die ClamAV-Implementierung<\/p>\n<pre class=\"brush:java\">\r\npublic class ClamAvScannerImpl implements Scanner\r\n{\r\n\r\n\tprivate static final Logger logger = Logger.getLogger(ClamAvScannerImpl.class);\r\n\r\n\tprivate ScannerResults scannerResults;\r\n\r\n\t\/**\r\n\t * Scans the file and returns the result.\r\n\t *\/\r\n\t@Override\r\n\tpublic synchronized ScannerResults scan(File source)\r\n\t{\r\n\r\n\t\ttry\r\n\t\t{\r\n\t\t\tProcess process =  new ProcessBuilder(\"clamscan\",source.getAbsolutePath()).start();\r\n\t\t\tint code \t\t= process.waitFor();\r\n\r\n\t\t\tswitch (code)\r\n\t\t\t{\r\n\t\t\t\tcase 0: scannerResults.setOk(true); break;\r\n\t\t\t\tcase 1: \r\n\r\n\t\t\t\t\tlogger.info(\"Virus found in: \"+source.getAbsolutePath());\r\n\t\t\t\t\tscannerResults.setMessage(\"Virus found!\");\r\n\t\t\t\t\tscannerResults.setOk(false);\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault: logger.warn(\"Unexpected return code from <b style=\"color: black; background-color: rgb(255, 255, 102);\">ClamAV<\/b>\"); break;\r\n\t\t\t}\r\n\r\n\t\t} catch (IOException e)\r\n\t\t{\r\n\t\t\t\tlogger.error(\"Problem starting <b style=\"color: black; background-color: rgb(255, 255, 102);\">ClamAV<\/b>!\");\r\n\t\t} catch (InterruptedException e)\r\n\t\t{\r\n\t\t\tlogger.error(\"Problem waiting for <b style=\"color: black; background-color: rgb(255, 255, 102);\">ClamAV<\/b>\");\r\n\t\t}\r\n\r\n\t\treturn scannerResults;\r\n\t}\r\n\r\n\tpublic void setScannerResults(ScannerResults scannerResults)\r\n\t{\r\n\t\tthis.scannerResults = scannerResults;\r\n\t}\r\n\r\n}\r\n\r\n<\/pre>\n<p>Die Ergebnisse:<\/p>\n<pre class=\"brush:java\">\r\npublic interface ScannerResults\r\n{\r\n\tboolean isOk();\r\n\r\n\tList getMessages();\r\n\r\n\tvoid setOk(boolean ok);\r\n\r\n\tvoid setMessage(String message);\r\n\r\n}\r\n\r\n<\/pre>\n<pre class=\"brush:java\">\r\npublic class ClamAVScannerResultsImpl implements ScannerResults\r\n{\r\n\tprivate boolean ok;\r\n\tprivate String message;\r\n\r\n\tpublic boolean isOk()\r\n\t{\r\n\t\treturn ok;\r\n\t}\r\n\r\n\tpublic List getMessages()\r\n\t{\r\n        if (message == null)\r\n            return new ArrayList(0);\r\n        else\r\n            return Arrays.asList(new String[]{message});\r\n\r\n\t}\r\n\r\n\tpublic void setOk(boolean ok)\r\n\t{\r\n\t\tthis.ok = ok;\r\n\t}\r\n\r\n\tpublic void setMessage(String message)\r\n\t{\r\n\t\tthis.message = message;\r\n\t}\r\n\r\n}\r\n\r\n<\/pre>\n<p>Dann im Controller\/Service beim Upload aufrufen:<\/p>\n<pre class=\"brush:java\">\r\n...\r\ntry\r\n\t\t\t{\r\n\t\t\t\tMultipartHttpServletRequest req = multiPartResolver.resolveMultipart(request);\r\n\t\t\t\tMultipartFile file \t\t\t\t= req.getFile(\"file\");\r\n\r\n\t\t\t\tScannerResults result \t\t\t= scanner.scan(new File(file.getName()));\r\n\t\t\t\tif(result.isOk())\r\n\t\t\t\t{\r\n\t\t\t\t\t\/\/save it!\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t\tmv.addObject(\"error\",\"file.virus\");\r\n\t\t\t} catch (MaxUploadSizeExceededException e)\r\n\t\t\t{\r\n\t\t\t\tmv.addObject(\"error\",\"file.maxupload\");\r\n\t\t\t}\r\n...\r\n\r\n<\/pre>\n<p>Vorher nat\u00fcrlich ClamAV installieren!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kleines Beispiel, wie man auf dem Server Dateien beim Upload auf Viren \u00fcberpr\u00fcfen kann: Das Scanner-Interface: public interface Scanner { ScannerResults scan(File source); } Die ClamAV-Implementierung public class ClamAvScannerImpl implements Scanner { private static final Logger logger = Logger.getLogger(ClamAvScannerImpl.class); private ScannerResults scannerResults; \/** * Scans the file and returns the result. *\/ @Override public synchronized&#8230; <\/p>\n<div class=\"read-more\"><a href=\"https:\/\/www.pmannel.de\/wordpress\/?p=94\">Weiterlesen<\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,9,4],"tags":[36],"class_list":["post-94","post","type-post","status-publish","format-standard","hentry","category-java","category-security","category-spring","tag-clamav"],"_links":{"self":[{"href":"https:\/\/www.pmannel.de\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/94","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pmannel.de\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pmannel.de\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pmannel.de\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pmannel.de\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=94"}],"version-history":[{"count":5,"href":"https:\/\/www.pmannel.de\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/94\/revisions"}],"predecessor-version":[{"id":99,"href":"https:\/\/www.pmannel.de\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/94\/revisions\/99"}],"wp:attachment":[{"href":"https:\/\/www.pmannel.de\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=94"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pmannel.de\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=94"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pmannel.de\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=94"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}