Image

Imagerudyryk wrote in Imageru_python

Файло-чистильщик

Что-то роботов в последнее время развелось... На днях несколько сайтов попортил какой-то робот-троян - видимо, утянул ftp-пароль, а потом записал в html и php файлы некий вредоносный javascript.

Написал простой и тупой чистильщик. Может кому-то пригодится что-то такое. Или на сниппеты разобрать :))



Код sitecleaner.py

#!/usr/bin/env python

from datetime import datetime
import os
import sys
import re

SCAN_EXTENSIONS = ('html', 'php', 'htm', )

SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
LOG_FILE = SCRIPT_DIR + '/log.txt'
INFO_FILE = SCRIPT_DIR + '/virinfo.txt'
INFO_DELIMITER = '||=***=||'

def scan():
    # get root dir
    try:
        rootdir = sys.argv[1]
    except IndexError:
        rootdir = os.getcwd()
    logfile = SCRIPT_DIR + '/log.txt'
    print '\nStart scanning:\n%s\n' % rootdir
    
    # read pattern to clean
    f = open(INFO_FILE, 'rb')
    virinfo = f.read().split(INFO_DELIMITER)
    f.close()
    patterns = []
    for p in virinfo:
        patterns.append(p.strip())
    print 'Patterns to remove:\n%s\n' % patterns
    
    # walk and clean
    files_list = []
    print 'Files found:'
    for root, sub_dirs, files in os.walk(rootdir):
        for file in files:
            if file.split('.')[-1].lower() in SCAN_EXTENSIONS:
                filepath = os.path.join(root,file) 
                healed = cleanfile(filepath, patterns)
                writelog(logfile, healed and 'HEALED' or 'CLEAN ', filepath)
                print filepath
            files_list.append(os.path.join(root,file))

def cleanfile(filepath, patterns):
    f = open(filepath, 'rb')
    old = f.read()
    f.close()
    new = old
    for p in patterns:
        new = new.replace(p, '')
    if len(old) != len(new):
        f = open(filepath, 'wb')
        f.write(new)
        f.close()
        return True
    return False

def writelog(logfile, result, filepath):
    log = open(logfile, 'a')
    log.write('%s %s  %s\n' % (datetime.now().strftime('%Y-%m-%d %H:%M:%S'), result, filepath, ))
    log.close()

if __name__ == '__main__':
    scan()



Пример virinfo.txt

<!-- ad -->...<!-- /ad -->
||=***=||
<script>check_content()</script>