Cách bảo mật PHP trong tải hình ảnh lên máy chủ

Tác giả admin+, T.Ba 18, 2011, 05:58:56 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Cách bảo mật PHP trong tải hình ảnh lên máy chủ


Hầu hết các PHP scripts và hệ thống quản lý nội dung (CMS scripts) đề yêu cầu quyền ghi 777 (rwxrwzrwz) phải được thiết lập cho các thư mục cho phép tải lên hình ảnh và tập tin. Nhiều chuyên gia bảo mật cảnh báo rằng việc thiết lập quyền thành 777 đồng nghĩa với việc bất kỳ ai cũng có thể đăng tải bất kỳ nội dung gì lên máy chủ của bạn, cài đặt các mã độc, chạy các chương trình phá hoại và có thể chiếm đoạt quyền quản lý máy chủ. Đây thực sự là một hiểm họa lớn.

Có 2 cách khả dĩ có thể được áp dụng trong trường hợp này.

Cách 1: thích hợp cho người dùng Web Shared Hosting.

  • Gán quyền 775 cho thư mục tải lên
  • Kiểm tra tập tin bằng cách sử dụng các hàm PHP (nếu tải lên hình ảnh)
  • Vô hiệu hóa directory indexes và script exection sử dụng .htaccess
  • Đặt thư mục tải lên ra ngoài thư mục gốc đặt website.

Đặt thư mục chứa ảnh tải lên bên ngoài thư mục chạy web.

Cách đơn giản nhất để bảo vệ nội dung của bạn là di chuyển thư mục ra ngoài tập tin gốc đặt trang web. Nếu là Cpanel thì đó là public_html và trong Plesk là httpdocs. Bằng cách này nội dung của thư mục mà bạn cho phép quyền ghi sẽ không bị lộ ra bên ngoài.

Trong mã PHP, bạn thiết lập để có thể truy cập vào thư mục nằm ngoài thư mục web gốc

Mã nguồn [Chọn]
./uploads

<img src="./uploads/photo.gif>

Cho đến lúc này, hacker vẫn có thể đăng tải và chạy các đoạn mã độc trên máy chủ của bạn do vậy bạn cần tạo một tập tin .htaccess vào trong thư mục tải lên để vô hiệu hóa việc thực thi CGI.

Vô hiệu hóa việc thực thi các script và ẩn chỉ mục với .htaccess

Tạo tập tin .htaccess với nội dung như sau.

Mã nguồn [Chọn]
Options -Indexes
Options -ExecCGI
AddHandler cgi-script .php .php3 .php4 .phtml .pl .py .jsp .asp .htm .shtml .sh .cgi

Hơn thế nữa, nếu bạn chỉ cho phép người dùng làm việc với các tập tin hình ảnh, bạn có thể cấm các loại tập tin khác bằng cách thêm đoạn code dưới đây vào .htaccess.

Mã nguồn [Chọn]
<Files ^(*.jpeg|*.jpg|*.png|*.gif)>
order deny,allow
deny from all
</Files>

Sử dụng các hàm PHP để kiểm tra các tập tin sẽ được tải lên.

Điều đầu tiên trong bảo mật tập tin được đăng tải là bạn kiểm tra kích thước và loại file. Do bởi bạn cho phép mọi người có thể tải lên nên họ có thể tải lên cả virus.

  • Kiểm tra loại tập tin tải và từ chối việc tải lên các loại file khác.
  • Cấm tập tin dựa trên dung lượng qui định.

Nếu bạn cho phép người dùng đăng tải tập tin hình ảnh (jpg,gif,png) thì mẹo ở đây là sử dụng hàm getimagesize() trong PHP. Nếu tập tin được tải lên là hình ảnh thì nó sẽ trả lại giá trị là "true" bằng ngược lại sẽ báo lỗi. Hàm getimagesize() còn trả lại thông tin width, height và type của tập tin. Vì vậy đừng quên kiểm tra chiều dài và rộng tập tin hình đã đăng tải nhằm ngăn chặn kích thước chỉ định.

Mã nguồn [Chọn]
<?php

// check for uploaded file size

if ($_FILES['imagefile']['size'] > 50000 )
{
die (
"ERROR: Large File Size");

}

//check if its image file

if (!getimagesize($_FILES['imagefile']['tmp_name']))
{ echo 
"Invalid Image File...";
exit();
}

// restrict width and height if its image or photo file

list($width$height$type$attr) = getimagesize($_FILES['imagefile']['tmp_name']);

if (
$width 100 || $height 100)
{
echo 
"Maximum width and height exceeded. Please upload images below 100×100 px size";
exit();
}

$blacklist = array(".php"".phtml"".php3″, ".php4″".js"".shtml"".pl" ,".py");
foreach (
$blacklist as $file)
{
if(
preg_match("/$file\$/i"$_FILES['userfile']['name']))
{
echo 
"ERROR: Uploading executable files Not Allowed\n";
exit;
}
}
?>

Nếu bạn cần từ chối yêu cầu tải lên từ các tập tin, bạn có thể tạo 1 danh sách blacklist về các tập tin ở dạng array và chạy lặp để kiểm tra phần header. Nhớ rằng đừng tin tưởng vào phần header của trình duyệt vì chúng có thể bị giả mạo.

Ghi chú: Để tham khảo thêm về hàm getimagesize() và kiểm tra danh sách blacklist bạn có thể tải tài liệu này. Link:   Đăng nhập để xem liên kết

Nhớ rằng một khi bạn đã di chuyển thư mục tải lên ra khỏi thư mục gốc, cách tốt nhất để xuất các tập tin (ở đây giả định là hình ành) thì cách tốt nhất là viết một đoạn mã PHP script (gọi nó là getimage.php), đọc tập tin và gửi phần header ra cho trình duyệt. Xem ví dụ dưới đây.

Mã nguồn [Chọn]
// this is just example only

$imgfile = $rsPhoto['photo']; // or value from database

list($width, $height, $type, $attr) = getimagesize($imgfile);

switch ($type)
{

case 1: $im = imagecreatefromgif($imgfile);
header("Content-type: image/gif");
break;

case 2:
$im = imagecreatefromjpeg($imgfile);
header("Content-type: image/jpeg");
break;

case 3:
$im = imagecreatefrompng($imgfile);
header("Content-type: image/png");
break;

}

Cách 2: Gán quyền tải lên cho tài khoản Apache.

Cách tốt nhất là nên quản lý bảo mật cho việc tải lên tập tin hơn là cho người dùng quyền được phép ghi. Thay vào đó ta sẽ trao quyền ghi cho tài khoản Apache. Chỉ việc chuyển quyền sở hữu thư mục cho tài khoản apache hoặc nobody và gán quyền 770 cho thư mục.

Bằng cách này, người ngoài sẽ không thể truy cập vào để đọc / ghi / thực thi trên thư mục tải lên. Lúc này chỉ có tài khoản apache là có quyền rwx và cũng chính apache là tài khoản sở hữu thư mục tải lên. Bạn có thể đặt thư mục tải lên vào trong thư mục web gốc.

Mã nguồn [Chọn]
chown -R apache tải lêns
chmod -R 770 tải lêns

Nếu có ai đó cố gắng truy cập vào thư mục tải lêns thông qua địa chỉ URL sẽ xuất hiện thông báo Forbidden.