dosyası ithalat güvenlik sorunu

3 Cevap php

ben bir sorum var

Biz mysql tabloya veri aktarmak için web kullanıcı için seçenek vermek, bu güvenli?

örneğin

    <form method="post" action="import.php" enctype="multipart/form-data">

    <input id="file1" name="file1" type="file">

 <input type="submit" name="button" id="button" value="Submit" >
    </form> 

ve import.php biz kod şu var

        <?php
       $theFile = $_FILES['file1'];
         $tmp_name1 = $theFile['tmp_name'];
        $row = 1;
        if (($handle = fopen($tmp_name1, "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
         $num = count($data);

        // SQL insert statement
        }
        fclose($handle);
        }

Bazı biri bu bunu güvenli nasıl web sunucusu geçici dizine gidecek herhangi bir komut dosyası veya. exe veya virüs yüklemek eğer benim soru nedir?

güvenli ne şekilde olacak?

Teşekkürler

3 Cevap

İşte not güvenlidir. En azından size dosyanın gerçekten bir tarih dosya ve sunucu değil etc / gibi / passwd zaten bir dosya olduğunu doğrulamak gerekir. Kullanmak gerekir yapmak için is_uploaded_file().

Örnek:

<?php
if (is_uploaded_file($_FILES['file1']['tmp_name'])) {
    $tmp_name1 = $_FILES['file1']['tmp_name'];
    if (($handle = fopen($tmp_name1, "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            $num = count($data);

            // SQL insert statement
        }
    fclose($handle);
    }
}

>

Ayrıca değişmeden birisi sunucusu dosyayı yürütür uzaktan dosya saldırısına neden olabilir dosyanın adını bırakarak sunucuya yüklenen herhangi bir dosyayı yeniden adlandırmak gerekir.

Dosya yükleme sadece görüntü gibi bazı dosya türünü, kabul etmek gerekiyor Son olarak, eğer, o zaman kesinlikle emin dosya aslında bir görüntü yapmak için kontrol etmelisiniz. Bir ise en azından vb. Gif,. Jpg, bu bir. Png olduğundan emin olmak için dosya uzantısını kontrol edin. Açıkçası olduğu gibi derhal reddetmek sonra exe bir görüntü değildir ve dolayısıyla kullanımı sizin için .

<?php
    if (is_uploaded_file($_FILES['file1']['tmp_name'])) {

        $allowedExtensions = array("txt","csv","htm","html","xml","css","doc","xls","rtf","ppt","pdf","swf","flv","avi","wmv","mov","jpg","jpeg","gif","png"); 
        if (!in_array(end(explode(".", strtolower($_FILES['file1']['name']))), $allowedExtensions)) { 
            // Bad file type. Error!  
        }
        else {
            $tmp_name1 = $_FILES['file1']['tmp_name'];
            if (($handle = fopen($tmp_name1, "r")) !== FALSE) {
                while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
                    $num = count($data);

                    // SQL insert statement
                }
                fclose($handle);
            }
        }
    }
?>    

Bu bölümünde bir sorun olmayacak böylece kod hiçbir dosyayı yürütür. Dosya açıldıktan sonra bir sorun olacağını olsun veya olmasın gelince, o ayrı bir mesele.

Sürece herhangi bir dosya çalıştırmak yoktur ve onlar dışarıdan (web sitenizin yani bir klasör) ulaşılabilir hangi bir konuma taşımak yok gibi, hiçbir güvenlik sorunu ne olursa olsun dosyaları var içerir.

Sadece çok dikkatli olmak gerekir, ve dosyaları yapmak istiyorum whatevwer bunu bu şekilde gelen herhangi bir dosya güvenmiyorum. Örneğin, onları idam asla. Onlar idam edilebileceği bir yere (güvenli olmayan bir indirme dizini örneğin .php dosya) içine koymayın.

Aksi takdirde, bu gerçekten dosyaları ile ne yapmak istediğinize bağlıdır. Bir standart Linux / Apache / PHP kurulum hızlı ve kolay bir Virüs kontrolü çözüm yoktur.

Mümkün olduğunca dosya yüklenenler kadar güvenli hale getirmek için neler yapılabileceği üzerinde tam bir özet için, check out this question , ona yanıtlar ve özellikle bobince en cevapta bağlantı.