[Security for Website PHP - Mysql] Bài 3: Module chống upload file thực thi (php, cgi,...)

Thảo luận trong 'Web Security' bắt đầu bởi luongtankhang123, 21/12/15, 03:12 AM.

  1. luongtankhang123

    luongtankhang123 W-------

    Tham gia: 02/07/13, 09:07 PM
    Bài viết: 47
    Đã được thích: 14
    Điểm thành tích:
    18
    Bài viết trước [Security for Website PHP - Mysql] Bài 2: Module chống XSS


    Xin chào mọi người, để tiệp tục chuỗi bài về bảo mật PHP - MySql, mình xin giới thiệu module chống upload các loại file thực thi.

    Bài 3: Module chống upload file thực thi

    I. Mở đầu
    Trên thực tế, các website chúng ta tạo ra hiện nay, chúng ta chỉ có thể giới hạn người dụng upload một số loại file nào đó như file ảnh, file nén, file lưu trữ văn bản,... và điều mà nhất thiết phải có chính là KHÔNG CHO UPLOAD FILE THỰC THI.
    Nhìn chung, đối với các website bán hàng, website cá nhân hay các diễn đàn các admin thường hạn chế người dùng upload các file như php, asp, cgi,... còn với các trang chia sẻ file, các bạn cần nghiên cứu sâu hơn và mục tiêu của bài này không nhằm vào hướng đi sâu đó.

    II. Giới thiệu code
    PHP:
    error_reporting(0);
    function 
    getExtension($str) {
        
    $i strrpos($str,".");
        if (!
    $i) { return ""; }
        
    $l strlen($str) - $i;
        
    $ext substr($str,$i+1,$l);
        return 
    $ext;
    }
    $allowedTypes strtolower('jpg|jpge|gif|png|');
    $allowedTypes explode('|',$allowedTypes);
    foreach(
    $_FILES as $var => $value) {
        if (
    is_array($_FILES["$var"]["name"]))
        {
            foreach (
    $_FILES["$var"]["name"] as $key => $values)
            {
                
    $filename $values;
                
    $extension=getExtension(strtolower($filename));
                if (!
    in_array($extension$allowedTypes))
                {
                    
    $_FILES["$var"]["name"][$key] = "YouCanNotUpLoadThisFileType";
                    
    $_FILES["$var"]["tmp_name"][$key] = "AccessDenied";
                }
            }
        }
        else
        {
            
    $filename $_FILES["$var"]["name"];
            
    $extension=getExtension(strtolower($filename));
                if (!
    in_array($extension$allowedTypes))
                {
                    
    $_FILES["$var"]["name"] = "YouCanNotUpLoadThisFile";
                    
    $_FILES["$var"]["tmp_name"] = "AccessDenied";
                }
        }
        
    }
    Giải thích:

    Đơn giản là mình sẽ tạo ra một list các đuôi file hợp lệ (ở đây là một số file ảnh) jpg|jpge|gif|png| các bạn có thể thay đổi tùy thuộc vào nhu cầu.
    Sau đó mình sẽ kiểm tra tên các file được upload, nếu file đó có đuôi không hợp lệ mình sẽ trả về tên là YouCanNotUpLoadThisFile
    Ở đây có thể áp dụng cho cả upload 1 file hoặc upload nhiều file.

    III. Sử dụng code
    Các bạn lưu lại với tên "AntiUpShell.php" và chèn đoạn mã sau vào file kết nối tới CSDL hoặc file xử lý upload (phảiđể trong file xử lý upload nếu nó nằm riêng lẽ và chưa require file kết nối CSDL)

    Mong mọi ngưới góp ý phát triển! :)
     
    Last edited by a moderator: 22/12/15, 11:12 PM
    Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
    Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan