2021年9月7日 星期二

Protect static files with Apache mod_xsendfile

網頁中的 Static files,若要經過驗證才能存取,
以 PHP 為例,
第一種做法是將檔案放在 DocumentRoot 以外的目錄,程式先檢查驗證,然後再用 readfile 讀檔吐出去
第二種做法是本文要介紹的 mod_xsendfile,一樣是將檔案放在 DocumentRoot 以外的目錄,
然後再送出 Header X-SENDFILE 告訴 Web Server 檔案在那,由 Web Server 直接存取。
若是檔案很大的話,第一種做法會耗用很多記憶體,第二種做法就省記憶體,跟 Static files 沒什麼兩樣

安裝 mod_xsendfile
yum -y install mod_xsendfile

httpd.conf 加入兩個參數
XSendFile On
XSendFilePath /data
XSendFilePath 是設定可以 X-SENDFILE 指向的白名單,可以設定多筆

應用範例:
DocumentRoot /var/www/html
Data folder /var/www/html/data
X-SENDFILE data folder /xsendfile

在 data 目錄建立 .htaccess,目的是將 data 下任何 URL 都先經過 index.php 檢查權限,再放行(X-SENDFILE)
.htaccess 內容
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [L]

index.php 內容
<?php
if (authCheck()) {
$filename= basename($_SERVER['REQUEST_URI']);
header('X-SENDFILE: /xsendfile/'.$filename);
header('Content-Type: '.mime_content_type('/xsendfile/'.$filename));
exit;

}
?>
<h1>Permission denied</h1>

註: nginx 也有類似的模組,叫 X-Accel

ref. mod_xsendfile 官網

沒有留言:

Stunnel

Stunnel 有點像 SSH tunnel,可以建立加密通道 原本未加密的協議,讓它走 Stunnel,就可以達到不改變協議,數據有加密的效果 以下用一個實例說明: A 要 telnet B,IP 12.34.56.78,因 telnet 協議本身未加密, 若要讓 A 到 B...