1
0
mirror of https://github.com/mosbth/cimage.git synced 2025-08-04 07:07:32 +02:00

Enable in config to disallow hotlinking/leeching #46

This commit is contained in:
Mikael Roos
2015-01-19 00:00:54 +01:00
parent 4fae208c4c
commit 5e08e5ed80
4 changed files with 86 additions and 16 deletions

View File

@@ -2158,7 +2158,7 @@ class CImage
$res = link($this->cacheFileName, $alias); $res = link($this->cacheFileName, $alias);
if ($res) { if ($res) {
$this->log("Created an alias to the cachefile: $alias"); $this->log("Created an alias as: $alias");
} else { } else {
$this->log("Failed to create the alias: $alias"); $this->log("Failed to create the alias: $alias");
} }

View File

@@ -280,6 +280,7 @@ Revision history
v0.6.x (latest) v0.6.x (latest)
* Disallow hotlinking/leeching by configuration #46.
* Alias-name is without extension #47. * Alias-name is without extension #47.
* Option `alias` now requires `password` to work #47. * Option `alias` now requires `password` to work #47.
* Support for option `password, pwd` to protect usage of `alias` and remote download. * Support for option `password, pwd` to protect usage of `alias` and remote download.

View File

@@ -143,6 +143,68 @@ $verbose = getDefined(array('verbose', 'v'), true, false);
/**
* Check if passwords are configured, used and match.
* Options decide themself if they require passwords to be used.
*/
$pwdConfig = getConfig('password', false);
$pwd = get(array('password', 'pwd'), null);
// Check if passwords match, if configured to use passwords
$passwordMatch = null;
if ($pwdConfig && $pwd) {
$passwordMatch = ($pwdConfig == $pwd);
}
verbose("password match = $passwordMatch");
/**
* Prevent hotlinking, leeching, of images by controlling who access them
* from where.
*
*/
$allowHotlinking = getConfig('allow_hotlinking', true);
$hotlinkingWhitelist = getConfig('hotlinking_whitelist', array());
$serverName = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : null;
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null;
$refererHost = parse_url($referer, PHP_URL_HOST);
if (!$allowHotlinking) {
if ($passwordMatch) {
; // Always allow when password match
} else if ($passwordMatch === false) {
errorPage("Hotlinking/leeching not allowed when password missmatch.");
} else if (!$referer) {
errorPage("Hotlinking/leeching not allowed and referer is missing.");
} else if (strcmp($serverName, $refererHost) == 0) {
; // Allow when serverName matches refererHost
} else if (!empty($hotlinkingWhitelist)) {
$allowedByWhitelist = false;
foreach ($hotlinkingWhitelist as $val) {
if (preg_match($val, $refererHost)) {
$allowedByWhitelist = true;
}
}
if (!$allowedByWhitelist) {
errorPage("Hotlinking/leeching not allowed by whitelist.");
}
} else {
errorPage("Hotlinking/leeching not allowed.");
}
}
verbose("allow_hotlinking = $allowHotlinking");
verbose("referer = $referer");
verbose("referer host = $refererHost");
/** /**
* Get the source files. * Get the source files.
*/ */
@@ -165,21 +227,6 @@ $img->setVerbose($verbose);
/**
* Check if passwords are configured, used and match.
* Options decide themself if they require passwords to be used.
*/
$pwdConfig = getConfig('password', false);
$pwd = get(array('password', 'pwd'), null);
// Check if passwords match, if configured to use passwords
$passwordMatch = null;
if ($pwdConfig) {
$passwordMatch = ($pwdConfig == $pwd);
}
/** /**
* Allow or disallow remote download of images from other servers. * Allow or disallow remote download of images from other servers.
* Passwords apply if used. * Passwords apply if used.

View File

@@ -164,6 +164,28 @@ return array(
*/ */
/**
* Prevent leeching of images by controlling who can access them from where.
* Default it to allow hotlinking.
* Password apply when hotlinking is disallowed, use password to allow.
* The whitelist is an array of regexpes for allowed hostnames that can
* hotlink images.
*
* Default values.
* allow_hotlinking: true
* hotlinking_whitelist: array()
*/
/*
'allow_hotlinking' => false,
'hotlinking_whitelist' => array(
'#^localhost$#',
'#^dbwebb\.se$#',
),
*/
/** /**
* Create custom shortcuts for more advanced expressions. * Create custom shortcuts for more advanced expressions.
* *