$ _SESSION变量在查询中使用

时间:2018-08-03 19:14:16

标签: session string

我已经花了将近两天的时间在这上面转圈。

在任何查询中将$ _SESSION或$ _POST用作字符串或将其转换为字符串以供使用时,我似乎都遇到困难。

我正在使用一种简单的哈希方法登录网站。

从脚本中提取的是

<?php
session_start();    
echo "******Running Authenticate<br>";
echo "data submitted<br>".$_POST['site_login']."<br>".$_POST['site_password']."<br><br>";
$SiteLogin =  $_POST['site_login']
$_SESSION['site_login'] = $_POST['site_login'];
$_SESSION['site_password'] = $_POST['site_password'];
$_SESSION['session_id'] = session_id();
$_SESSION['Now_val']  = date('Y-m-d H:i:s');
//include 'showallvars.php';
include 'dbconfig.php';
// Prepare our SQL 
if ($stmt = $con->prepare('SELECT site_index, site_password FROM web_sites WHERE site_login = ?')) {
    // Bind parameters (s = string, i = int, b = blob, etc), hash the password using the PHP password_hash function.

    $stmt->bind_param('s', $_POST['site_login']);
    $stmt->execute(); 
    $stmt->store_result(); 
    // Store the result so we can check if the account exists in the database.


if ($stmt->num_rows > 0) {
        $stmt->bind_result($id, $password);
        $stmt->fetch();   

    echo "account exists";   
    }
    else
    {
    header('Location: badindex.php');
    }

if (password_verify($_POST['site_password'], $password)) {
// Verification success! User has loggedin!
echo "password good";

}
else
{
header('Location: badindex.php');
}
}

$_SESSION['loggedin'] = TRUE;


?>

效果很好

但是记录中还有一个我想保留的字段(“ site_name”)。 这应该很简单!

有十多种方法  例如“标准”示例类似

$name = $mysqli->query("SELECT site_name FROM web_sites WHERE site_login = 'fred'")->fetch_object()->site_name; 

那很好 但是无论我如何尝试-串联或或...我都无法用$ _SESSION ['site_login']或$ _POST ['site_login']来代替'fred'。 似乎添加了空白。

协助或指导?

2 个答案:

答案 0 :(得分:0)

应该可以像执行以下操作一样容易:

所以:

if ($stmt = $con->prepare('SELECT site_index, site_password 
    FROM web_sites WHERE site_login = ?')) {

成为:

if ($stmt = $con->prepare('SELECT site_index, site_password, site_login 
    FROM web_sites WHERE site_login = ' . $SiteLogin)) {

请注意,直接将$ SiteLogin解析为查询是一种不好的做法,因为现在有人可以通过SQL Inject并攻击您的网站。他们需要做的就是使用您的表单并弄清楚哪个字段负责$ SiteLogin。您将需要转义$ SiteLogin。假设使用Mysqli,它将变成:

if ($stmt = $con->prepare('SELECT site_index, site_password, site_login 
    FROM web_sites WHERE site_login = ' . $con->real_escape_string($SiteLogin))) {

答案 1 :(得分:0)

谢谢你,但是当我看到你答案中的大括号时,一切都涌回了我。我忘记了PHP在方括号方面存在问题

 $sql = ("SELECT site_name FROM web_sites WHERE site_login = '". $_SESSION{'site_login'} ."' LIMIT 1");

我知道这很容易!

您对注入的评论当然是正确的,但这是编辑后的代码摘录,而$ SiteLogin只是作为“临时工作变量(如果需要)”添加的。