PHP Ban Ziyaretçi ve

2 Cevap php

Ben birisi bu "belli" dosyasını ziyaret ettiğinde onlar allready değilse bu yasak olsun ki ben belirli dosyaları içine isteyen am aşağıdaki kodu var. ama nedense bu i elle bir kullanıcı eklerseniz gayet iyi çalışıyor ve eko Banned, veritabanına yeni ziyaretçiler ekleyerek değil! ama aksi takdirde sadece echo $ sql sorgusu ama aslında bunu yapmaz.

<?php
$host=""; // Host name
$username=""; // Mysql username
$password=""; // Mysql password
$db_name="banlist"; // Database name
$tbl_name="list"; // Table name

// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");

// Define $myusername and $mypassword
$ip = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];

$sql="SELECT * FROM $tbl_name WHERE ip='$ip'";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);
// If result matched $myusername and $mypassword, table row must be 1 row

if ($count==0){
$sql="INSERT INTO $tbl_name (`id` ,`ip`) VALUES (NULL , $ip)";
mysql_query($sql);
echo $sql;
//header("location:index.html");
} else {
// Register $myusername, $mypassword and redirect to file "login_success.php"
//header("location:index.html");
echo "banned!";
exit();
}
?>

2 Cevap

Çift kontrol ettiniz ki senin MySQL account has the INSERT privilege?

Ayrıca işler daha düzgün gittiğini göreceksiniz eğer always check the return value of mysql_query(). Eğer gelişmekte yaparken, (snippet'inizde sonundan itibaren) bu satırları değişebilir:

mysql_query($sql);
echo $sql;

... Bunun için:

$result = mysql_query($sql);

if($result === FALSE) {
    echo 'INSERT failed with this error: '.mysql_error();
} else {
    echo 'INSERT succeeded';
}

Henüz SQL injection aşina değilseniz Ayrıca, aşina olmak isteyeceksiniz. Sizin kod yapar, çünkü, bu tür saldırılardan şu anda açık değil filter input ve onu etmez escape output (bir IP adresi arıyorsanız HTTP başlıklarını) ( dinamik olarak inşa SQL sorguları değişken kısım).

Sadece birkaç açıklamalar

$sql="SELECT * FROM $tbl_name WHERE ip='$ip'";
$result=mysql_query($sql);

yapmak daha iyi olmaz bir

$sql="SELECT count(*) FROM $tbl_name WHERE ip='$ip'";
$result=mysql_query($sql);

Eğer bu verileri kullanmak yok çünkü.

$sql="INSERT INTO $tbl_name (`id` ,`ip`) VALUES (NULL , '$ip')";
mysql_query($sql);

Sizin id bir otomatik artış ise bunu dahil etmek zorunda değilsiniz

$sql="INSERT INTO $tbl_name (`ip`) VALUES ('$ip')";
mysql_query($sql);

Bu muhtemelen tablodaki varchar beri Sen $ ip belirtmelidir.

Since an ip address should be a sort of unique identifier you have better to use the IP as primary key. last point checking for results of mysql_query would be a good pratice, like there

$sql="INSERT INTO $tbl_name (`ip`) VALUES ($ip)";
$ret = mysql_query($sql);
if (!$ret) {
    die('Invalid query: ' . mysql_error());
}

Ben size olup bitenler hakkında değerli bilgiler vereceğini düşünüyorum. bu durumda o muhtemelen (çünkü eksik tırnak) IP adrese yakın bir hata var söyleyebilirim.