【问题标题】:How to use the sql function CONCAT with a prepared statement如何在准备好的语句中使用 sql 函数 CONCAT
【发布时间】:2015-06-11 12:36:08
【问题描述】:

向下滚动以帮助我,问题已得到解释。

问题几乎解决了!

我正在尝试使用 cookie 执行自动登录脚本,并且遇到了一个非常有趣的教程:http://blog.monstruosor.com/2013/05/18/php-auto-connexion-par-cookie/

这是他提出的代码:

function autologin() {
$key = $_COOKIE['autologin'];

$ip = $_SERVER['REMOTE_ADDR'];

$query = "SELECT * FROM users WHERE SHA1(CONCAT('SEL1-df546', `name`, `id`, 'SEL2-sd55fd', `last_connection`, $ip))=$key";
$infos = $users->exec($query);

if(!is_array($infos) || empty($infos)) {
    // Mauvais cookie !
    return false;
}

$_SESSION['user'] = $infos; // Mise en SESSION
return true;

我感兴趣的主线是这条:

$query = "SELECT * FROM users WHERE SHA1(CONCAT('SEL1-df546', `name`, `id`, 'SEL2-sd55fd', `last_connection`, $ip))=$key";
$infos = $users->exec($query);

但是,它并不安全。我想知道如何使用在这条线上准备的应用程序。 我试过了,但它不起作用:

    $req = $this->_db->prepare("SELECT * FROM Members WHERE SHA1(CONCAT(HASH1-1dg9sf', `id`, `first_name`, 'HASH2-dt5w1q', `last_name`, ip = :ip)) = :key");
    $req->execute(array(
        'ip' => htmlspecialchars($ip),
        'key' => htmlspecialchars($key)));

$this->_db 来自我的班级,写得很好,别担心。问题出在这里:

$req = $this->_db->prepare("SELECT * FROM Members WHERE SHA1(CONCAT(HASH1-1dg9sf', `id`, `first_name`, 'HASH2-dt5w1q', `last_name`, ip = :ip)) = :key");

希望有人有解决方案。


这里有更多信息:

我的 index.php 页面包含:

$ip = $_SERVER['REMOTE_ADDR'];
$key = $_COOKIE['auto_login'];
$mg->autoLogin($ip, $key);

还有我班级里的 autoLogin 方法:

    public function autoLogin($ip, $key)
{
    $req = $this->_db->prepare("SELECT * FROM Members WHERE SHA1(CONCAT(HASH1-1dg9sf', `id`, `first_name`, 'HASH2-dt5w1q', `last_name`, :ip)) = :key");
    $req->execute(array(
        'ip' => htmlspecialchars($ip),
        'key' => htmlspecialchars($key)));
    $donnee = $req->fetch();    
    $req->closeCursor();
    if(!is_array($donnee) || empty($donnee)) 
    {
       return false;
    }
    else
    {
        $_SESSION['user'] = $donnee;
        return true;
    }
}

如果您仍需要更多信息,尽管问我,我会再次更新我的问题!


这是最后一个问题

感谢pala_几乎解决了它

我知道问题出在哪里。 在我的数据库中,我尝试登录的成员的存储 IP 是“ ::1 ”。但是当我执行“echo $ip;”时,这里生成:“$ip = $_SERVER['REMOTE_ADDR'];”,我有“127.0.0.1”!当我进行验证时,它不是同一个 IP,所以问题可能就在这里!知道如何解决这个问题吗?

问题就在这里,因为如果我执行“$ip = '::1';”,它就可以工作。有什么想法吗??

【问题讨论】:

    标签: php mysql sql cookies concatenation


    【解决方案1】:

    试试这个:

    $req = $this->_db->prepare("SELECT * FROM Members WHERE SHA1(CONCAT('HASH1-1dg9sf', `id`, `first_name`, 'HASH2-dt5w1q', `last_name`, :ip)) = :key");
    

    错误在这里:ip = :ip 只需要是:ip 并且这里CONCAT(HASH1-1dg9sf' 需要是CONCAT('HASH1-1dg9sf'

    这里有一些完整的、经过测试(并且可以工作)的代码。使用 PDO。

     $stmt = $pdo->prepare("SELECT * FROM users WHERE SHA1(CONCAT('HASH1-1dg9sf', `id`, `first_name`, 'HASH2-dt5w1q', `last_name`, :ip)) = :key");
            $ip = '10.0.0.1';
            $key = 'HASH1-1dg9sf2himHASH2-dt5w1qalso10.0.0.1';
            $key = sha1($key);
            $res = $stmt->execute(array('ip' => $ip, 'key' => $key));
            print_r($stmt->fetchAll(PDO::FETCH_ASSOC));
    

    并具有以下输出: 数组

    (
        [0] => Array
            (
                [id] => 2
                [first_name] => him
                [last_name] => also
                [ip] => 10.0.0.1
            )
    
    )
    

    从我的测试数据库的以下行中检索到:

    mysql> SELECT * FROM users WHERE SHA1(CONCAT('HASH1-1dg9sf', `id`, `first_name`, 'HASH2-dt5w1q', `last_name`,'10.0.0.1'));
    +------+------------+-----------+-----------+
    | id   | first_name | last_name | ip        |
    +------+------------+-----------+-----------+
    |    1 | me         | last      | 127.0.0.1 |
    +------+------------+-----------+-----------+
    

    【讨论】:

    • 它不起作用,我会更新我的问题以提供更多细节
    • 嗯。你从使用users 表转到members 表。是哪个?
    • 会员一,用户是我找到的网站上的教程,但是好主意
    • 别担心,我是第一次使用这个sql函数,我也有点迷茫,我们就是为了这个:)
    • 如果它仍然不起作用,另一个问题是你如何生成 $key 值
    猜你喜欢
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多