php - 我的代码可以安全注入(inject)吗?

标签 php mysql sql pdo

我以前用的是 MySQL,被告知它不安全,所以现在我用 PDO 重新编码了我的管理登录面板,这里和其他论坛的用户说不能注入(inject)。但是黑客仍在进入...登录后我编辑了页面并告诉黑客告诉我我在上面放了什么,黑客告诉我...

我需要知道我的代码是否安全。他告诉我他正在通过 SQL 进入。

所以首先我将他们的 IP 存储在一个 session 中,所以如果他们的 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";
}

代码可以注入(inject)吗?

这是我的 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;
}

最佳答案

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

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

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

你的陈述:

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

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

  1. 在使用它做任何事情之前验证用户名或您从外部接收到的任何数据($_SESSION、$_POST、一些 $_SERVER 和其他)。当然是在您执行任何数据库交互之前。
  2. 像在其他查询中一样使用变量绑定(bind)。

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

顺便说一句,您实际上并不需要使用 PDO 来使用变量绑定(bind)。在 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 代码注入(inject)攻击的有趣阅读 on this page .

关于php - 我的代码可以安全注入(inject)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10765671/

相关文章:

C++ sql将整数传递给sql字符串

sql - 如何在 SQL Server 数据库架构中找到所有填充 100% 空值的列?

php - 对 PHP 的 bcmul() 规模感到困惑

php - 根据另一个表的列对一个表进行排序

javascript - html css 或 php gd 库两个图像合并 Angular 到 Angular

php - 单击按钮时从数据库中选择随机和唯一的行

mysql - 数据库超时 1 小时

php - 在单个网页上一次显示来自数据库的记录

php - 如何创建 Gmail 聊天?如何连接到 AIM 并允许 AIM 聊天?

PHP session 为空或无法正常工作