apiye post gönderdiğimiz bi veri var, sonuç geliyor vs.
şimdi şöyle bi güvenlik önlemi istiyorum.
örneğin bi ip üzerinde saatlik x adet post gönderebilsin. daha fazla veri çekmek, bilgi almak istediğinde uyarı versin ve x dakika işlem yapamazsın, lütfen x dakika sonra tekrar dene. gibi bi uyarı istiyorum.
kabaca
kişi farklı isimlerle sisteme giriş yapabilir,
1. veriyi çeker, 5 çeker 10. çeker,
11. veri çekmek istediğinde bi uyarı olarak "çok hızlı gidiyorsun, 15 dakika sonra tekrar dene"
gibi birşey.
nasıl yapabilirim, herhangi bi örneğine rastlamadım.
+ olarak ip adresi yerine nasıl bi garanti önlem alabiliriz?
İp adresi dışında alternatif çözümler arasında cookie,session gibi çerez verileri devreye girebilir. Ama bunlar ( cookie ) manipule edilebilir. Ayrıca apiye uzaktan bağlantı yapan kişininde ilgili bağlantı başlığında bunları iletmesi gerekir.
IP taraflı yapacağınız iş aşağıdaki şekilde olur. Veritabanına gerek yok disktede yapılır.
Api dosyanız ( Örnek index.php ) <?php
function get_ip()
{
if(getenv("HTTP_CLIENT_IP")) {
$ip = getenv("HTTP_CLIENT_IP");
} elseif(getenv("HTTP_X_FORWARDED_FOR")) {
$ip = getenv("HTTP_X_FORWARDED_FOR");
if (strstr($ip, ',')) {
$tmp = explode (',', $ip);
$ip = trim($tmp[0]);
}
} else {
$ip = getenv("REMOTE_ADDR");
}
return $ip;
}
function ip_counter($limit=5)
{
$result = array();
$result['status'] = false;
$ip = get_ip();
$list = file_get_contents('list.html');
$time = time();
preg_match_all('@<ip value="(.*?)" time="(.*?)"></ip>@si',$list,$ips);
$check_already = array_search($ip, $ips[1]);
if($check_already)
{
$last_time = $ips[2][$check_already];
$difference = $time-$last_time;
if($difference>=5)
{
$replace_line = preg_replace('@<ip value="'.$ip.'" time="(.*?)"></ip>@si','<ip value="'.$ip.'" time="'.$time.'"></ip>',$list);
file_put_contents('list.html',$replace_line);
$result['status'] = true;
$result['ip_next_time'] = $limit;
}
else
{
$result['status'] = false;
$result['ip_next_time'] = $limit-$difference;
}
}
else
{
$add_line = PHP_EOL.'<ip value="'.$ip.'" time="'.$time.'"></ip>';
file_put_contents('list.html',$add_line, FILE_APPEND);
$result['status'] = true;
$result['ip_next_time'] = $limit;
}
return $result;
}
$ip_counter = ip_counter(5);
$ip_next_time = $ip_counter['ip_next_time'];
if($ip_counter['status'])
{
// Burada başarılı api isteğine karşı kodlarınız
echo 'İstek Başarılı!<br>';
echo 'Sonraki İstek İçin Beklenmesi Gereken Süre: '.$ip_next_time.' Sn';
}
else
{
// Rate Limit
echo 'İstek Başarısız!<br>';
echo 'Sonraki İstek İçin Beklenmesi Gereken Süre: '.$ip_next_time.' Sn';
}
?>
Loglar list.html dosyasında tutulur.