2012-05-10 36 views
8

Những gì tôi đang Làm:Làm thế nào để lưu trữ một cách an toàn các tập tin trên một máy chủ

tôi về cơ bản cần phải tạo ra một trang web được bảo đảm bằng một trang đăng nhập viết bằng PHP rằng một khi đã đăng nhập, bạn có một thanh tìm kiếm mà đọc số nguyên và dữ liệu được gửi đến một tập lệnh PHP để truy xuất một hình ảnh với số đó làm tên của nó.

(Tôi sẽ được lưu trữ một vài ngàn hình ảnh trên máy chủ này được tìm kiếm - hình ảnh hàng tồn kho)

-

Những gì tôi cần giúp đỡ với:

Từ nghiên cứu của tôi, tôi hiểu rằng bạn "không" sử dụng cơ sở dữ liệu như MySQL để lưu trữ hình ảnh thực tế vì tốc độ và không hiệu quả. Nếu bạn không lưu trữ nó trong một cơ sở dữ liệu, và bạn để nó trên hệ thống tệp của máy chủ như được đề xuất, nếu ai đó nhập một URL trực tiếp vào thanh địa chỉ, nó sẽ không đưa chúng vào các tệp trên máy chủ của tôi?

Làm cách nào để bạn chống lại điều này. Tôi không thể không có tệp nào trên máy chủ của mình để có thể xem được mà không đi qua trang đăng nhập thành công.

Cảm ơn bạn đã được trợ giúp, mọi thông tin chi tiết hoặc đề xuất sẽ được đánh giá cao. Điều này quan trọng đối với tôi vì thông tin phức tạp hơn sẽ được thêm vào trong tương lai.

+2

Bạn có thể có thư mục không thể truy cập qua HTTP và bạn có thể sử dụng tập lệnh php để kiểm tra xem người dùng có đăng nhập hay không và đọc tệp từ thư mục được chỉ định và xuất tệp đó. –

+0

Tôi đã đọc để lại một tệp tin bên ngoài thư mục "public_html". Điều đó có làm cho nó hoàn toàn không thể truy cập từ http? Tập lệnh php của tôi sẽ truy cập vào các tệp như thế nào? – DMor

+0

'public_html' thường là thư mục mà từ đó các tệp được phân phát, khi sử dụng Apache với cPanel. Điều đó có nghĩa là khi bạn nhập 'http: // yoursite.com', dữ liệu sẽ được lấy từ'/var/www/username/public_html'. Điều đó cũng có nghĩa là bất cứ điều gì bạn nhập vào URL, '/ var/www/username' là ** not ** access. Nó cũng có nghĩa là một thư mục mà bạn muốn tạo ở đó, chẳng hạn như '/ var/www/username/files' cũng sẽ không thể truy cập được. Từ kịch bản PHP của bạn, bạn sẽ truy cập nó với một cái gì đó như 'file_get_contents ('/ var/www/username/files/imagename.extension');'. –

Trả lời

6

một đề nghị cách o f xử lý tải xuống tệp qua PHP (hoặc bất kỳ tập lệnh nào khác) bằng cách sử dụng tiêu đề phản hồi 'X-Sendfile' được gọi là.

Tập lệnh PHP xử lý xác thực và sau khi xác thực, nó sẽ đặt một số tiêu đề phản hồi cùng với 'X-Sendfile' để cho máy chủ web phân phối tệp; tập lệnh kết thúc và máy chủ web tiếp quản.

Xem ở đây cho một ví dụ đơn giản:

http://www.jasny.net/articles/how-i-php-x-sendfile/

+1

Tôi sẽ xem xét điều này, cảm ơn bạn. – DMor

0

bạn có thể làm theo cách này viết một nguồn lực phục vụ trong php như thế này

image.php?requestid=..... 

trong tập tin mà bạn nhận được requestid và đọc liên kết thực tế (liên kết địa phương) từ cơ sở dữ liệu, đọc file ảnh sau đó dữ liệu đầu ra Trình duyệt

$id = $_GET['requestid']; 
$link = get_local_link_from_id($id); // return /images/file1.png...... 
$data = file_get_contents($link); 
header('Content-Type', 'image/png'); 
echo $data; 

Nhưng tôi nghĩ rằng bạn không nên làm điều đó, chỉ cần đổi tên tập tin một cách ngẫu nhiên và tạo ra rất nhiều trong số họ ....

+0

Họ cần phải giữ lại số ban đầu, nó không phải là hệ thống của tôi, nhưng theo yêu cầu của người thuê tôi. Và điều này là đủ an toàn? miễn là tập lệnh PHP của tôi lọc các yêu cầu, đúng không? – DMor

+0

GET không bao giờ an toàn, thậm chí POST cũng có thể không đủ để bảo mật. – ilhnctn

+0

@ilis - điểm của nhận xét của bạn là gì? GET và POST là các phương thức được HTTP sử dụng, chúng chỉ là "không an toàn" nếu bị lạm dụng khi diễn giải đầu vào của người dùng. –

1

này có thể là quá mức cần thiết cho situtation của bạn, nhưng đây là cách tôi đang suy nghĩ về làm việc đó trên một ứng dụng tôi đang phát triển:

đầu tiên , có 4 máy chủ, máy chủ web, máy chủ trung gian và máy chủ dữ liệu

khi ai đó gửi yêu cầu đến máy chủ web, máy chủ web kết nối với máy chủ phần mềm trung gian và yêu cầu tệp, đi dọc theo thông tin xác thực người dùng như khóa phiên và tệp được yêu cầu. phần mềm trung gian kết nối với db và xác nhận hợp lệ phiên mà người dùng đặc quyền đối với tệp đó. nó sẽ trả về lỗi hoặc dữ liệu nhị phân nếu chúng có quyền truy cập. nếu bạn tắt bộ đệm đầu ra trên cả máy chủ web và máy chủ phần mềm trung gian, bạn có thể gửi 100k khối từ máy chủ trung gian tới máy chủ web và máy chủ web sẽ xuất khối đầu tiên trong khi nó nhận khối thứ hai.

file chính nó có thể được lưu trữ trên máy chủ cơ sở dữ liệu thông qua FTP, SFTP, hoặc chia sẻ file khác

nó chắc chắn không hiệu quả như sử dụng x-sendfile, nhưng nếu ai đó có thể để riêng máy chủ web của bạn, họ sẽ vẫn không có quyền truy cập vào tệp - trong các trường hợp ở trên, họ sẽ làm như vậy. máy chủ web là máy chủ công cộng duy nhất, vì vậy phần còn lại của máy chủ phải được kết nối trên mạng riêng.

bạn cũng có thể gửi dữ liệu đến một máy chủ mã hóa sẽ mã hóa/giải mã dữ liệu tập tin thực tế

nếu có ai có bất kỳ ý tưởng về cách cải thiện về vấn đề này, tôi đang quan tâm.

+0

Thú vị, nhưng điều này chắc chắn là phức tạp hơn tôi cần (nhưng nó là thú vị để đọc). Tôi thực sự không biết về .htaccess tại thời điểm đó và nó có thể chặn xem toàn bộ thư mục. Tôi đã thực hiện điều này. Tôi có một biểu mẫu đăng nhập HTML lấy dữ liệu, gửi nó đến một kịch bản xử lý để xác thực người dùng, nếu được xác thực, sẽ gửi người dùng đến một trang tìm kiếm. người dùng nhập vào một Item # và được gửi đến một kịch bản xử lý khác để truy cập một cơ sở dữ liệu với số đó là Primary Key, giữ một đường dẫn tệp và thông tin khác. Nếu nó tồn tại, nó kéo đường dẫn tập tin – DMor

+0

thư mục hình ảnh được bảo vệ bởi .htaccess ("TỪ TỪ TẤT CẢ"). Tôi cũng sử dụng SSL và lưu trữ các thông tin khác liên quan đến hình ảnh trong một db MySQL – DMor

Các vấn đề liên quan