PHP Ban Visitor&插入mySQL DB

时间:2009-11-20 04:40:15

标签: php mysql

我有以下代码,我想要进入某些文件,以便当有人访问这个“特定”文件时,如果他们还没有完全被禁止。但由于某种原因,它没有添加新的访问者进入数据库,如果我手动添加用户它工作正常和回声的禁止!但是否则它只是回显$ sql查询但实际上并没有这样做。

<?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 个答案:

答案 0 :(得分:1)

您是否仔细检查过您的 MySQL帐户是否具有INSERT权限

如果你总是检查mysql_query()的返回值,你也会发现事情会更顺利。在开发过程中,您可以更改这些行(从代码段的末尾开始):

mysql_query($sql);
echo $sql;

......对此:

$result = mysql_query($sql);

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

此外,如果您还不熟悉SQL injection,那么您需要熟悉它。您的代码目前容易受到此类攻击,因为它不会过滤输入(您正在寻找IP地址的HTTP标头)并且它不会转义输出< / strong>(动态构造的SQL查询的可变部分)。

答案 1 :(得分:0)

只是几条评论

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

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

因为您不使用该数据。

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

如果您的ID是自动增量,则不必包含它

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

你应该引用$ ip,因为它可能是你表中的varchar。

由于IP地址应该是一种唯一标识符,因此最好将IP用作主键。 最后一点检查mysql_query的结果将是一个很好的实践,就像那里

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

我认为它可以为您提供有关正在发生的事情的宝贵信息。在这种情况下,它可能会说你在IP地址附近有一个错误(因为缺少引号)。