【发布时间】:2012-05-26 11:03:22
【问题描述】:
我之前使用 MySQL,被告知它不安全,所以现在我在 PDO 中重新编写了我的管理员登录面板,这里和其他论坛的用户说不能注入。但是黑客还在进来……我登录后编辑了页面,告诉被黑客告诉我我在上面放了什么,黑客告诉我……
我需要知道我的代码是否安全。他告诉我他正在通过 SQL 进入。
所以首先我将他们的 IP 存储在一个会话中,因此如果他们的 IP 发生更改,它将注销他们(或用户名)
if ( isset($_SESSION['last_ip']) == false )
{
$_SESSION['last_ip'] = $_SERVER['REMOTE_ADDR'];
}
if ( $_SESSION['last_ip'] !== $_SERVER['REMOTE_ADDR'] )
{
session_unset();
session_destroy();
}
然后这是我的登录信息:
session_start();
include 'functions/functions.php';
$db = mysqlconnect();
$password = md5($_POST['mypassword']);
$mod = 1;
$statement = $db->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$statement->execute(array($_POST['myusername'],$password));
$result = $statement->fetchObject()->mod;
$count = $statement->rowCount();
if ( $result == 1 ) {
$db = mysqlconnect();
// Register $myusername, $mypassword and redirect to file "login_success.php"
$_SESSION['user'] = $_POST['myusername'] ;
//Test if it is a shared client
if ( !empty($_SERVER['HTTP_CLIENT_IP']) ) {
$ip=$_SERVER['HTTP_CLIENT_IP'];
//Is it a proxy address
} elseif ( !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ) {
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip=$_SERVER['REMOTE_ADDR'];
}
$sqll = "UPDATE users SET lastip=? WHERE username=?";
$q = $db->prepare($sqll);
$q->execute(array($ip,$_SESSION['username']));
$_SESSION['user'] = $_POST['myusername'] ;
$sqlll = "INSERT INTO user_log (username,ip) VALUES (?, ?)";
$qq = $db->prepare($sqlll);
$qq->execute(array($_SESSION['username'],$ip));
header("Location: home.php");
} else {
echo "Wrong Username or Password";
}
代码可以注入吗?
这是我的 home.php 页面,它阻止用户查看它。
/// My conenct is here
$sql = "SELECT * FROM users WHERE username='$_SESSION[user]'";
$result = mysql_query($sql) or die(mysql_error());
$values = mysql_fetch_array($result);
if( isset($_SESSION['user']) ) {
} else {
echo "Bye Bye";
die;
}
if ( $values['mod'] == 1 ) {
echo "welcome";
} else {
echo"Your account has been reported for hacking";
die;
}
【问题讨论】:
-
在 SQL 中使用
$_POST['myusername']之前,您应该验证其格式是否正确。一个简单的preg_match()就足够了,或者您可以将其转义到另一个变量,然后搜索该变量。还有,$_SERVER['HTTP_CLIENT_IP']是从哪里来的? -
我认为在 pdo 中你不需要格式化变量??
-
黑客在做什么?为什么说“他进来了”,为什么会认为是 SQL 注入?
-
如果黑客已经进去了,你怎么知道这是实际执行的代码?
-
您不应该信任代理/转发的 $_SERVER 变量。这些是客户提供的数据,伪造起来很简单。唯一可靠的客户端 IP 值是
$_SERVER['REMOTE_ADDR'],它由 php 确定,而不是用户。