我已经花了将近两天的时间在这上面转圈。
在任何查询中将$ _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'。 似乎添加了空白。
协助或指导?
答案 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只是作为“临时工作变量(如果需要)”添加的。