3

我以前使用 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;
}
4

2 回答 2

1

假设您显示的查询是您使用的唯一查询,那么黑客如何使用您认为会阻止他的代码是很有趣的。在 IT 世界中,前门通常是三重锁着的,而后门是开着的。在这种情况下,它不是后门,而是门上的小窗户,用于查看是否没有向骗子打开。

对所有查询使用准备好的语句和变量绑定。

这是一般规则。您只是忘记了“所有查询”中的“全部”。

您的声明:

$sql = "SELECT * FROM users WHERE username='$_SESSION[user]'";

是你打开的窗口。很明显,您的黑客在会话数据中欺骗了用户名。简单的解决方案是:

  1. 验证用户名或您从外部收到的任何数据($_SESSION、$_POST、一些 $_SERVER 和其他),然后再对它进行任何操作。当然在您执行任何数据库交互之前。
  2. 像在其他查询中那样使用变量绑定。

在这种情况下,删除标签或使用 mysql_real_escape_string 的价值较小,因为在没有任何不可存储的字符的情况下完全可以破解。

顺便说一句,您实际上并不需要使用 PDO 来使用变量绑定。在mysql中也是完全可能的。

$verbLok = mysqli_connect(Iam, not, gonna, tellyou);
$result = array();
if (($stmtLok = $verbLok->prepare( "SELECT * FROM users WHERE username = ?  limit 1")))
{        
    $stmtLok->bind_param("s", $_SESSION[user]);
    $stmtLok->execute();
    $result = $stmtLok->get_result();
    $stmtLok->close();
}
mysqli_close($verbLok);

应该为您解决问题。$result 将保存一个结果行数组。我对传统查询不太熟悉了,但据我所知,它与您的代码相似。

可以在此页面上找到有关如何对您的查询进行 SQL 代码注入攻击的有趣阅读。

于 2013-09-16T23:40:49.183 回答
-1

一个好的 SQL 注入预防措施是转义任何和所有可用于在评估中终止 SQL 命令以启动新命令的文本。

为此,您应该转义输入中的任何引号,并使用更好的 SQL — 在字段和表名周围使用反引号,使用引号包裹任何非代码文本等。

SELECT * FROM `users` WHERE `id` = '1'

mysql_real_escape_string然后用, 或手动替换 #039;转义所有引号;等,还要确保转义任何 HTML 以确保它不会弄乱其他东西,使用htmlentities等。

于 2012-05-28T20:41:48.633 回答