Python ile dosya kontrolü scripti

0
(0)

Web sitenize dosya yükleme işlemi yaptırıyorsunuz diyelim. Tüm kontrolleri de sağladınız ama gözden kaçırdığınız bir güvenlik açığı oldu ve sitenize istenmeyen bir dosya yüklendi bunu nasıl yakalarsınız?

Bunun gibi can sıkıcı bir durumla karşılaştığınızda aşağıda örneğini paylaştığım Python Script’i ile güvenliğinizi arttırabilirsiniz.

Kodu paylaşmadan önce çalışma prensibini anlatayım.

Kod çalıştığı anda bulunduğu klasöre 3 adet dosya yaratacaktır.

"dosya_beyazliste.txt" 
Tarama esnasında görmezden gelinecek dosya isimleri Ör: index.php, upload.php
"uzanti_beyazliste.txt"
Tarama esnasında görmezden gelinecek dosya uzantıları Ör: png,jpg,gif
"log.txt"
Tarama sonucunun çıktıları.

Script içerisinde de bazı parametreleri ayarlamanız gerekecek aşağıda onları anlatacağım.

yol = "./dosyaKontrol/"

Scriptin çalışacağı klasör, eğer bulunduğu dizinde çalıştırmak isterseniz “./” olarak ayarlayabilirsiniz.

karantinaKlasoru = "../k/" #scriptin çalıştığı klasörde olmaması önerilir. en azından bir üst klasörde olmalı.

Tehdit olarak bulunan dosyaların taşınacağı karantina klasörü.

wlFileName = "dosya_beyazliste.txt"
wlExFileName = "uzanti_beyazliste.txt"
logFileName = "log.txt"

Bunları zaten yukarıda anlattım 🙂

karantinaGonder = 'h' #[ e | h ]

Tehdit olarak bulunan dosyaları karantina klasörü olarak belirlediğiniz klasöre taşınması onayı. Scripti ilk çalıştırdığınızda “h” olarak kalmasında fayda var. Sonrasında log.txt ye bakıp hariç tutacağınız uzantı ve “dosyaları dosya_beyazliste.txt” ve “uzanti_beyazliste.txt” ye ekledikten sonra “e” olarak işaretleyin. (unutmayın küçük harf e veya h)

 

Bu arada Python Script’i yükledikten sonra klasör yetkilerinin “0744” de olması gerektiğini de hatırlatmak isterim. Bu scripti ister bir PHP upload işlemi sonrasına yada bir ChronJob işlemine bağlayarak periodik olarak yapabilirsiniz.

Ekran görüntülerini de paylaşıyorum. İlk ekran görüntüsü Python script’in PHP içerisinden çağırılmasının çıktısıdır.

Python script çalıştıktan sonra log.txt çıktısı.

Script dosyasını yüklediğiniz klasörün durumu

Tehdit olarak algılanan dosyanın karantinaya taşındığı durum.

“dosya_beyazliste.txt” ve  “uzanti_beyazliste.txt” nizin yaklaşık olarak olması gereken içeriği

Bir yerlerde paylaşırsanız ya da Python scripti kullanırsanız yada sırf emeğe saygı için kaynak belirtmenizi rica ederim 🙂

DijitalTurk.com | File Control

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import shutil
from datetime import datetime

#DijitalTurk.com

now = datetime.now()
 #print("now =", now)
# dd/mm/YY H:M:S
dt_string = now.strftime("%d/%m/%Y %H:%M:%S")
#print("date and time =", dt_string)



#yol = "./"
yol = "./dosyaKontrol/"
karantinaKlasoru = "../k/" #scriptin çalıştığı klasörde olmaması önerilir. en azından bir üst klasörde olmalı.
wlFileName = "dosya_beyazliste.txt"
wlExFileName = "uzanti_beyazliste.txt"
logFileName = "log.txt"

karantinaGonder = 'h' #[ e | h ]

warnMsg = ' [KONTROL] '
warnCreateFile = ' dosyası oluşturuldu [SİSTEM] '
myNameIs = 'DosyaKontrolV2.py'

karantinaYol = yol+karantinaKlasoru
whiteListFile = yol+wlFileName
whiteListExtention = yol+wlExFileName
logFile = yol+logFileName
tarananDosyaSayisi = 0

logList = []
fileNameWhiteList = []
fileExtentionWhiteList = []
allList = os.listdir(yol)

#print("**** allList ****")
#print(allList)
print("\n -------- START --------- \n")

if not os.path.isdir(karantinaYol):
    os.mkdir(karantinaYol)



if os.path.isfile(whiteListExtention):
    f1 = open(whiteListExtention, "r")
    fileExtentionWhiteList = f1.readlines()
    f1.close()
else:
    print(whiteListExtention + warnCreateFile)
    f1 = open(whiteListExtention, "w")

if os.path.isfile(whiteListFile):
    f2 = open(whiteListFile, "r")
    fileNameWhiteList = f2.readlines()
    f2.close()
else:
    print(whiteListFile + warnCreateFile)
    f2 = open(whiteListFile, "w")

fileNameWhiteList.append(whiteListExtention)
fileNameWhiteList.append(whiteListFile)
fileNameWhiteList.append(myNameIs)
fileNameWhiteList.append(wlFileName)
fileNameWhiteList.append(wlExFileName)
fileNameWhiteList.append(logFileName)

new_fileNameWhiteList = [s.replace('\r\n', '') for s in fileNameWhiteList]
new_fileExtentionWhiteList = [s.replace('\r\n', '') for s in fileExtentionWhiteList]

print("\n **** Dikkate alınmayan dosya ve uzantılar**** \n")
print(new_fileExtentionWhiteList)
print(new_fileNameWhiteList)
print("\n ----------------- \n")


def isDeleteFile(root,fileName):
    if fileName.split('.')[-1].lower() not in new_fileExtentionWhiteList:
              if fileName not in new_fileNameWhiteList:
                logList.append( warnMsg + root + fileName)
                print( warnMsg  + root  + fileName)
                if karantinaGonder == 'e':
                    shutil.move(root + fileName, karantinaYol + fileName + "_sec")

for root, dirs, file in os.walk(yol):
      for fileName in file:
        tarananDosyaSayisi = tarananDosyaSayisi+1
        isDeleteFile(root , fileName)

forLog = open(logFile,"w")#KONTROL ET
#forLog.write("Now the file has more content!")
#print(logList)
forLog.write('\n Zaman: ' + dt_string + ' \n  Toplam taranan dosya sayısı: ' + str( tarananDosyaSayisi ) + ' \n Kontrol edilmesi gereken dosya sayısı: ' +  str( len(logList) )+ '\n')
for l in logList:
    forLog.write(l + '\n')
    #forLog.write(" ".join(l) + "\n")
    #print(l)
forLog.close()


print( '\n Zaman: ' + dt_string + ' Toplam taranan dosya sayısı: ' + str( tarananDosyaSayisi ) + ' Kontrol edilmesi gereken dosya sayısı: ' +  str( len(logList) ) )

 

Bu yazıyı faydalı buldunuz mu?

Değerlendirmek için yıldızlara tıklayın.

Ortalama puan 0 / 5. Toplam oy: 0

Bu yazıyı henüz kimse değerlendirmemiş. İlk siz oy verin !

Bu yazıyı faydalı bulmadığınız için çok üzüldük.

Görüşleriniz bizim için çok değerli.

Nasıl daha faydalı bir yazı hazırlayabiliriz?