保护 WordPress "uploads" 文件夹内文件的策略
Strategies to protect files inside the "uploads" folder in WordPress
我正在客户网站上创建自定义礼品卡 PDF,并希望保护它们免受 public 访问,同时仍然能够在后端访问。通过 Apache 的 .htaccess 或 nginx 的位置阻止规则阻止特定目录工作正常,但现在我如何访问后端中的文件?
策略#1
使用神秘的文件夹和文件名
在这种情况下,您不需要阻止通过 Nginx 或 Apache 访问 PDF(除了遍历目录,但无论如何都应该打开)。例如,PDF 的路径可能如下所示:
/wp-content/uploads/plugin-name/year-month-day/ndLr83nH06Vd63jnbm46Ghied7/giftcard-order-0815-item-8015.pdf
public function generatePDF(){
(....)
$upload_dir = ABSPATH . "wp-content/uploads/plugin-name/" . date( "Y-m-d" ) . "/" . $this->randomString(24);
if ( ! file_exists( $upload_dir ) ) {
mkdir( $upload_dir, 0775, true );
}
$path = $upload_dir . "/giftcard-order-$order_id-item-$item_id.pdf";
//mpdf is the library I am using to generate custom PDF's
$mpdf->Output( $path, \Mpdf\Output\Destination::FILE );
return $path;
}
public function randomString( $length = 4 ) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen( $characters );
$randomString = '';
for ( $i = 0; $i < $length; $i ++ ) {
$randomString .= $characters[ rand( 0, $charactersLength - 1 ) ];
}
return $randomString;
}
然后您可以简单地使用 generatePDF() 方法生成的路径为礼品卡创建附件 post(post_type = shop_coupon 在 WooCommerce 中)然后访问它通过媒体库。
public function attachPDF( $pdf_path, $shop_coupon_id, $order_id ) {
$attachment = array(
'post_title' => "Giftcard PDF - Order #$order_id, Coupon #$shop_coupon_id",
'post_status' => 'private',
'post_parent' => $shop_coupon_id
);
$attach_id = wp_insert_attachment( $attachment, $pdf_path );
return $attach_id;
}
现在您只需要在服务器上设置fail2ban 来保护您的站点免受暴力攻击。或者您可以使用 WordPress 安全插件之一(WordFence、WP Cerber 等)。
策略#2
通过 Nginx/Apache 规则拒绝访问文件
此策略可以非常简单地阻止对您要保护的文件的任何未经授权的访问。另一方面,现在更难编写在需要时访问文件的功能。使用此策略,您现在只能通过 PHP 代码访问文件。因此,如果您想打开或下载文件,则必须为此编写自定义前端应用程序或使用提供此类功能的外部插件。
我正在客户网站上创建自定义礼品卡 PDF,并希望保护它们免受 public 访问,同时仍然能够在后端访问。通过 Apache 的 .htaccess 或 nginx 的位置阻止规则阻止特定目录工作正常,但现在我如何访问后端中的文件?
策略#1
使用神秘的文件夹和文件名
在这种情况下,您不需要阻止通过 Nginx 或 Apache 访问 PDF(除了遍历目录,但无论如何都应该打开)。例如,PDF 的路径可能如下所示:
/wp-content/uploads/plugin-name/year-month-day/ndLr83nH06Vd63jnbm46Ghied7/giftcard-order-0815-item-8015.pdf
public function generatePDF(){
(....)
$upload_dir = ABSPATH . "wp-content/uploads/plugin-name/" . date( "Y-m-d" ) . "/" . $this->randomString(24);
if ( ! file_exists( $upload_dir ) ) {
mkdir( $upload_dir, 0775, true );
}
$path = $upload_dir . "/giftcard-order-$order_id-item-$item_id.pdf";
//mpdf is the library I am using to generate custom PDF's
$mpdf->Output( $path, \Mpdf\Output\Destination::FILE );
return $path;
}
public function randomString( $length = 4 ) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen( $characters );
$randomString = '';
for ( $i = 0; $i < $length; $i ++ ) {
$randomString .= $characters[ rand( 0, $charactersLength - 1 ) ];
}
return $randomString;
}
然后您可以简单地使用 generatePDF() 方法生成的路径为礼品卡创建附件 post(post_type = shop_coupon 在 WooCommerce 中)然后访问它通过媒体库。
public function attachPDF( $pdf_path, $shop_coupon_id, $order_id ) {
$attachment = array(
'post_title' => "Giftcard PDF - Order #$order_id, Coupon #$shop_coupon_id",
'post_status' => 'private',
'post_parent' => $shop_coupon_id
);
$attach_id = wp_insert_attachment( $attachment, $pdf_path );
return $attach_id;
}
现在您只需要在服务器上设置fail2ban 来保护您的站点免受暴力攻击。或者您可以使用 WordPress 安全插件之一(WordFence、WP Cerber 等)。
策略#2
通过 Nginx/Apache 规则拒绝访问文件
此策略可以非常简单地阻止对您要保护的文件的任何未经授权的访问。另一方面,现在更难编写在需要时访问文件的功能。使用此策略,您现在只能通过 PHP 代码访问文件。因此,如果您想打开或下载文件,则必须为此编写自定义前端应用程序或使用提供此类功能的外部插件。