私はPHPページを持っています の実行アクセスをファイアウォール内のクライアントに限定する必要があります。特定のip-rangeからのリクエストへのPHPページの実行の制限
はは、どのように私は(*。。例えば10 または200.10.10。*)クライアント IPアドレスを検索し、IP-範囲にそれを一致させることができ、PHPスクリプトを記述します。
私はPHPページを持っています の実行アクセスをファイアウォール内のクライアントに限定する必要があります。特定のip-rangeからのリクエストへのPHPページの実行の制限
はは、どのように私は(*。。例えば10 または200.10.10。*)クライアント IPアドレスを検索し、IP-範囲にそれを一致させることができ、PHPスクリプトを記述します。
あなたは、与えられたネットワーク/マスクの組み合わせを確認するために、そしてちょうどいくつかの算術演算を実行するlong値に点線の四角形を変換するip2longを使用することができます:スパイダー/ボット/クライアント用など
$network=ip2long("200.10.10.0");
$mask=ip2long("255.255.255.0");
$remote=ip2long($_SERVER['REMOTE_ADDR']);
if (($remote & $mask) == $network)
{
//match!
}
else
{
//does not match!
}
Apacheを使用していると仮定すると、使用できるmod_authz_hostというモジュールがあります。
ファイルディレクティブと一緒に、特定のPHPスクリプトへのアクセスをIPアドレスの範囲に対して制限することができます。ここで
は、そのモジュールのドキュメントへのリンクです: http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html
ここで(あなたのphpファイルはadmin.phpと呼ばれていると仮定して)簡単な例です:
<file admin.php>
Order Deny,Allow
Deny from all
Allow from 200.10.10
</file>
他に追加された利点ここで提案されている解決策は、アプリケーションロジックの外部からセキュリティの側面を制御できることです。これは、PHPコードに制限を課さない、より柔軟なアプローチです。
+1(OPがアクセス権を持っている場合) – Cheekysoft
私もこのソリューションが好きです。私は完全な仮想ホストやディレクトリを保護することもできると思います。 私はPHPで解決策を作っていませんでした。 –
PHPリミット/ブロックウェブサイトのリクエスト。 ここで私はあなたのウェブサイトトラフィックを減らすために望ましくないリクエストをブロックできるPHP関数を書いています。クモ、ボット、厄介なクライアントのための神。 DEMO:サーバ設定/ .htaccessファイルでこれを固定するのではなくPHPで http://szczepan.info/9-webdesign/php/1-php-limit-block-website-requests-for-spiders-bots-clients-etc.html
/* Function which can Block unwanted Requests
* @return boolean/array status
*/
function requestBlocker()
{
/*
Version 1.0 11 Jan 2013
Author: Szczepan K
http://www.szczepan.info
me[@] szczepan [dot] info
###Description###
A PHP function which can Block unwanted Requests to reduce your Website-Traffic.
God for Spiders, Bots and annoying Clients.
*/
$dir = 'requestBlocker/'; ## Create & set directory writeable!!!!
$rules = array(
#You can add multiple Rules in a array like this one here
#Notice that large "sec definitions" (like 60*60*60) will blow up your client File
array(
//if >5 requests in 5 Seconds then Block client 15 Seconds
'requests' => 5, //5 requests
'sek' => 5, //5 requests in 5 Seconds
'blockTime' => 15 // Block client 15 Seconds
),
array(
//if >10 requests in 30 Seconds then Block client 20 Seconds
'requests' => 10, //10 requests
'sek' => 30, //10 requests in 30 Seconds
'blockTime' => 20 // Block client 20 Seconds
),
array(
//if >200 requests in 1 Hour then Block client 10 Minutes
'requests' => 200, //200 requests
'sek' => 60 * 60, //200 requests in 1 Hour
'blockTime' => 60 * 10 // Block client 10 Minutes
)
);
$time = time();
$blockIt = array();
$user = array();
#Set Unique Name for each Client-File
$user[] = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 'IP_unknown';
$user[] = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
$user[] = strtolower(gethostbyaddr($user[0]));
# Notice that i use files because bots does not accept Sessions
$botFile = $dir . substr($user[0], 0, 8) . '_' . substr(md5(join('', $user)), 0, 5) . '.txt';
if (file_exists($botFile)) {
$file = file_get_contents($botFile);
$client = unserialize($file);
} else {
$client = array();
$client['time'][$time] = 0;
}
# Set/Unset Blocktime for blocked Clients
if (isset($client['block'])) {
foreach ($client['block'] as $ruleNr => $timestampPast) {
$left = $time - $timestampPast;
if (($left) > $rules[$ruleNr]['blockTime']) {
unset($client['block'][$ruleNr]);
continue;
}
$blockIt[] = 'Block active for Rule: ' . $ruleNr . ' - unlock in ' . ($left - $rules[$ruleNr]['blockTime']) . ' Sec.';
}
if (!empty($blockIt)) {
return $blockIt;
}
}
# log/count each access
if (!isset($client['time'][$time])) {
$client['time'][$time] = 1;
} else {
$client['time'][$time]++;
}
#check the Rules for Client
$min = array(
0
);
foreach ($rules as $ruleNr => $v) {
$i = 0;
$tr = false;
$sum[$ruleNr] = '';
$requests = $v['requests'];
$sek = $v['sek'];
foreach ($client['time'] as $timestampPast => $count) {
if (($time - $timestampPast) < $sek) {
$sum[$ruleNr] += $count;
if ($tr == false) {
#register non-use Timestamps for File
$min[] = $i;
unset($min[0]);
$tr = true;
}
}
$i++;
}
if ($sum[$ruleNr] > $requests) {
$blockIt[] = 'Limit : ' . $ruleNr . '=' . $requests . ' requests in ' . $sek . ' seconds!';
$client['block'][$ruleNr] = $time;
}
}
$min = min($min) - 1;
#drop non-use Timestamps in File
foreach ($client['time'] as $k => $v) {
if (!($min <= $i)) {
unset($client['time'][$k]);
}
}
$file = file_put_contents($botFile, serialize($client));
return $blockIt;
}
if ($t = requestBlocker()) {
echo 'dont pass here!';
print_R($t);
} else {
echo "go on!";
}
+1これははるかに良い解決策です。ありがとう! –