1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
<?php
/**
* Functions for dealing with proxies
*
* @file
*/
/**
* Extracts the XFF string from the request header
* Note: headers are spoofable
*
* @deprecated in 1.19; use $wgRequest->getHeader( 'X-Forwarded-For' ) instead.
* @return string
*/
function wfGetForwardedFor() {
wfDeprecated( __METHOD__, '1.19' );
global $wgRequest;
return $wgRequest->getHeader( 'X-Forwarded-For' );
}
/**
* Returns the browser/OS data from the request header
* Note: headers are spoofable
*
* @deprecated in 1.18; use $wgRequest->getHeader( 'User-Agent' ) instead.
* @return string
*/
function wfGetAgent() {
wfDeprecated( __METHOD__, '1.18' );
global $wgRequest;
return $wgRequest->getHeader( 'User-Agent' );
}
/**
* Work out the IP address based on various globals
* For trusted proxies, use the XFF client IP (first of the chain)
*
* @deprecated in 1.19; call $wgRequest->getIP() directly.
* @return string
*/
function wfGetIP() {
wfDeprecated( __METHOD__, '1.19' );
global $wgRequest;
return $wgRequest->getIP();
}
/**
* Checks if an IP is a trusted proxy providor.
* Useful to tell if X-Fowarded-For data is possibly bogus.
* Squid cache servers for the site are whitelisted.
*
* @param $ip String
* @return bool
*/
function wfIsTrustedProxy( $ip ) {
global $wgSquidServers, $wgSquidServersNoPurge;
$trusted = in_array( $ip, $wgSquidServers ) ||
in_array( $ip, $wgSquidServersNoPurge );
wfRunHooks( 'IsTrustedProxy', array( &$ip, &$trusted ) );
return $trusted;
}
/**
* Forks processes to scan the originating IP for an open proxy server
* MemCached can be used to skip IPs that have already been scanned
*/
function wfProxyCheck() {
global $wgBlockOpenProxies, $wgProxyPorts, $wgProxyScriptPath;
global $wgMemc, $wgProxyMemcExpiry, $wgRequest;
global $wgProxyKey;
if ( !$wgBlockOpenProxies ) {
return;
}
$ip = $wgRequest->getIP();
# Get MemCached key
$mcKey = wfMemcKey( 'proxy', 'ip', $ip );
$mcValue = $wgMemc->get( $mcKey );
$skip = (bool)$mcValue;
# Fork the processes
if ( !$skip ) {
$title = SpecialPage::getTitleFor( 'Blockme' );
$iphash = md5( $ip . $wgProxyKey );
$url = wfExpandUrl( $title->getFullURL( 'ip='.$iphash ), PROTO_HTTP );
foreach ( $wgProxyPorts as $port ) {
$params = implode( ' ', array(
escapeshellarg( $wgProxyScriptPath ),
escapeshellarg( $ip ),
escapeshellarg( $port ),
escapeshellarg( $url )
));
exec( "php $params >" . wfGetNull() . " 2>&1 &" );
}
# Set MemCached key
$wgMemc->set( $mcKey, 1, $wgProxyMemcExpiry );
}
}
|