Rating sisteminde bir sorun var.
Panelden en fazla 5 oy verilebildiği halde, gelen bir user bir milyon oy vermiş. ip koruması var, her ipden bir kere oy verilebiliyor. zaten bir kere oy vermiş.
Sorum şu. 5 den fazla oy vermesini nasıl kısıtlarım. Eğer yapamazsam sql çağrısını oy 5 den fazla ise göstermesin diye nasıl ayarlarım.
Cevaplayan arkadaşlara önceden teşekkürler.
Web tabanlı olarak elde edebileceğimiz bilgiler, oldukça kısıtlı olduğundan, ziyaretçi tarafından gönderilen bilgiler için, %100 güvenlik sağlanması, zaten mümkün dğeildir. Ama tek başına, IP kontrolü yapmak da, kesinlikle yetersiz bir önlemdir. Saldırgan, herhangi bir proxy uygulaması veya eklentisi ile, bu korumayı, kolayca aşabilir, zaten söylediğinize göre aşmışta.
Size tavsiyem, öncelikle saldırganın proxy kullanıp kullanmadığını, belirlemeye çalışmanız (eğer high anony ise, bu tespitide yapamazsınız), tespit edebilirseniz, proxy arkasından gelen ip adresinide kontrol altına almanız, daha sonra sisteminizde, oy göndermeyle ilgili session ve cookie kontrolü sağlamanız olacak. Elbette bu da yeterli bir koruma olmayacak, ama en azından saldırganın, ip değişikliğiyle birlikte, oturumdan çıkması ve cookilerini temizlemesi de gerekecek ve işini biraz da olsa zorlaştırmış olacaksınız.
PHP:
<?PHP
ob_start();
session_start();
// Örnek 1 - Proxy kontrolü
if (!empty($_SERVER["REMOTE_ADDR"]) AND empty($_SERVER["HTTP_VIA"]) AND empty($_SERVER["HTTP_X_FORWARDED_FOR"])) {
// Proxy yok veya iyi gizlenmiş
$params_ip = $_SERVER["REMOTE_ADDR"]; // ziyaretçi ip
$params_proxy = "";
$params_proxyvia = "";
$params_iss = @gethostbyaddr($_SERVER['REMOTE_ADDR']);
}
else {
// Proxy var
$params_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
$params_proxy = $_SERVER["REMOTE_ADDR"]; // ziyaretçi ip
$params_proxyvia = $_SERVER["HTTP_VIA"]; // proxy ip
$params_iss = @gethostbyaddr($_SERVER['HTTP_X_FORWARDED_FOR']);
}
// Örnek 2 - Oturum (Session) kontrolü
// Çalışan sayfanın en üstünde (ob_start(); ifadesinin altında olabilir) session_start(); ifadesinin yer aldığından emin olun.
// IP adresinin, $params_ip olarak geldiğini var sayıyorum
if (empty($_SESSION["userip"])) {
// Oturum kontrolü, sunucuda özel olarak ayarlanmamışsa, kullanıcı oturumu sonlandırmadığı müddetçe, yaklaşık 22dk kadar aktif kalır.
$_SESSION["userip"] = $params_ip; // ilk giriş yaptığı ip adresini oturuma alıyoruz
}
else {
// Eğer oturum zaten mevcutsa, süreyi uzatmak için yeniliyoruz.
$_SESSION["userip"] = $_SESSION["userip"];
}
// Örnek 3 - Cookie kontrolü
// Çalışan sayfanın en üstünde ob_start(); ifadesinin yer aldığından emin olun.
// IP adresinin, $params_ip olarak geldiğini var sayıyorum
if (empty($_COOKIE["userip"])) {
// Kullanıcı silene kadar, 24 saat aktif olucak bir cookie oluşturuyoruz
setcookie("userip", $params_ip, time()+86400); // 86400 = 24 saat
}
// Kontrol - kendi bilgilerine göre düzenlemen lazım
$query = mysql_query("SELECT * FROM anket WHERE ip='".$params_ip."' OR ip='".$_SESSION["userip"]."' OR ip='".$_COOKIE["userip"]."'");
$kayitsayisi = mysql_num_rows($query);
if ($kayitsayisi > 0) {
// bu kullanıcı daha önce oy vermiş
}
else {
// oy vermesinde bir sakınca görünmüyor
}
?>
Ayrıca, eğer sitenizin kitlesi, belirli bir kesimden oluşuyorsa (örneğin Türkiye, Almanya vb..) bu kitlenin dışından gelen kullanıcıların, oy vermesini engelleyebilirsiniz. Bu sayede ziyaretçi, belirlediğiniz bölgelerin dışında kalan bir proxy adresi kullandığında, oy vermeside söz konusu olmayacaktır. Bu tespiti yapmak için kullanabileceğiniz çeşitli araçlar ve servis sağlayıcı siteler mevcut.
http://www.codedcode.com/php/iptocountry/the_script.asp
http://www.hostip.info/use.html
PHP:
// IP adresinin, $params_ip olarak geldiğini var sayıyorum
$country = file_get_contents('http://api.hostip.info/country.php?ip='.$params_ip);
echo $country;