会话没有通过,我想限制用户在登录时查看登录页面,因为我尝试了很多东西,但它没有工作:
我的登录页面
flatMap
我的主页
<?php
error_reporting(E_ALL);
ini_set('display_errors',1);
require_once('connect.php');
extract($_POST);
$result = mysqli_query($link, "SELECT * FROM users ");
$row = mysqli_fetch_assoc($result);
//var_dump($row['username']);
//var_dump($row['password']);
if(isset($_POST['login'])){
$username = $_POST['username'];
$password = md5($_POST['password']);
if ($username == $row['username'] && $password == $row['password']){
session_start();
$_SESSION['nID'] = true;
//echo"Login";
header('Location: home.php');
} else {
echo"Login failed";
}
}
?>
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html>
<head>
<meta charset="UTF-8">
<title>Login page</title>
<link href="style.css" type="text/css" rel="stylesheet">
</head>
<body>
<div id="frm">
<form action="login.php" method="POST" style="width: 232px; padding-left: 490px;">
<h1> Login</h1>
<p>
<label>Username</label>
<input type="text" id="username" name="username" />
</p>
<p>
<label>password</label>
<input type="password" id="password" name="password"/>
</p>
<p>
<input type="submit" id="btn" value="login" name="login" style="border-radius: 30%; background-color: gold; box-shadow: 0 12px 16px 0 rgba(0,0,0,0.24), 0 17px 50px 0 rgba(0,0,0,0.19);"/>
</p>
<p>
Not yet a member <a href="register.php">Register here</a>
</form>
</div>
</body>
</html>
会话未通过,并且在用户未登录时也无法阻止用户查看主页。
我尝试过很多不同的东西,但似乎没什么用。
答案 0 :(得分:6)
1)停止使用extract()
。你根本就不需要它。
警告
不要在不受信任的数据上使用extract(),例如用户输入(即$_POST
,$_FILES
等)。如果您这样做,例如,如果您想暂时运行依赖于register_globals
的旧代码,请确保使用其中一个非覆盖标志值,例如 EXTR_SKIP ,并注意到您应该以{{1}}中的variables_order中定义的顺序提取。
2)因为noted in another answer你的SQL查询太模糊了;您将返回搜索整个数据库的第一个答案,而不是搜索任何特定条件。
php.ini
然后拿下这一行并与给定的密码进行比较:
SELECT password FROM users WHERE username=username_here LIMIT 1
3)您在MySQL / PHP上使用的密码系统是 NOT GOOD ENOUGH 。停止使用md5()
并使用password_hash
和password_verify
PHP函数。请阅读how to do it properly和this comment。
4)每当您使用if($password === $row['password'])
重定向用户时, 强烈推荐 您添加header("Location: ...")
或{{之后立即执行命令,以便停止当前页面上的代码执行。例如:
die
5)exit
和header("Location: this_page_will_never_load.php");
header("Location: this_page_will_always_load_instead.php");
函数不需要括号。
在这里引用require
的众多答案;如果在输出发送到浏览器后调用 {em>},则会生成错误通知。即使使用以下内容,OP也未报告错误通知:
include
因此,session_start()
代码中的session_start()
位置在此特定情况下不是一个问题。
然而:
是最佳做法,尽早将 error_reporting(E_ALL);
ini_set('display_errors',1);
放入代码中,然后再调试{{} 1}}这会导致session_start无法加载因为session_start()
已经将数据输出到浏览器。
我想限制用户在登录时查看登录页面,因为我尝试了很多东西,但它没有用:
session_start()
中的代码:
var_dump
只有在为页面提供POSTed数据时,var_dump
页面上的上述代码才会执行。你所拥有的是,一旦有人正确登录然后他们返回login.php页面,他们不 重新提交 POSTed数据,所以这个代码块根本就没有运行。
由于此代码块包含所有login.php
引用,因此 if(isset($_POST['login'])){
///session stuff etc.
}
似乎未运行。
相反,您希望在login.php
中执行此操作(简化):
$_SESSION
答案 1 :(得分:1)
在你的home.php中试试这个条件
public void run() {
byte[] buffer = new byte[1048576]; // 20 bits
int bytes;
String strRx = "";
while (running) {
try {
bytes = connectedInputStream.read(buffer);
final String strReceived_freq = new String(buffer,0, bytes);
final String strReceived_pxx = new String(buffer,(bytes/2)+1, bytes);
//final int samples_sdr=new Integer(buffer,0,bytes);
final String strByteCnt = String.valueOf(bytes) + " bytes received.\n";
runOnUiThread(new Runnable(){
@Override
public void run() {
Pxx_value.setText(strReceived_pxx+"\n"); // get data PXX
freq_value.setText(strReceived_freq+"\n"); // get data freq
// plot value
/* for (int i=0; i<nb_points; i++)
{
freq[i]=Double.parseDouble(strReceived_freq);
pxx[i]=Double.parseDouble(strReceived_pxx);
series.appendData(new DataPoint(freq[i],pxx[i]), true,500);
}*/
}});
答案 2 :(得分:-1)
<?php
session_start();
error_reporting(E_ALL);
ini_set('display_errors',1);
require_once('connect.php');
extract($_POST);
$result = mysqli_query($link, "SELECT * FROM users ");
$row = mysqli_fetch_assoc($result);
//var_dump($row['username']);
//var_dump($row['password']);
if(isset($_POST['login'])){
$username = $_POST['username'];
$password = md5($_POST['password']);
if ($username == $row['username'] && $password == $row['password']){
//session_start(); removed it
$_SESSION['nID'] = true;
//echo"Login";
header('Location: home.php');
} else {
echo"Login failed";
}
}
?>
更新,你试试这段代码
您需要在页面标题
中添加session_start()
的每个页面
答案 3 :(得分:-1)
1st:首先,您的查询错误。您始终在表格中查看第一位用户的值。您需要使用where
子句进行查询。
SELECT * FROM users WHERE username=username_here AND password=hash_password_here
第二名:您的If
声明应如下所示。
<?php
session_start();
if (!isset($_SESSION['nID'])) {
header("Location: login.php");
die();
}
?>
3Rd:尝试使用预准备语句以避免sql injection
。
$stmt = $link->prepare("SELECT * FROM users where username=? and password=?");
$stmt->bind_param('ss',$username,md5($password));
$stmt->execute();
$get_result =$stmt->get_result();
$row_count= $get_result->num_rows;
if ($row_count>0){
session_start();
$_SESSION['nID'] = true;
header('Location: home.php');
die();
} else {
echo"Login failed";
}
第4名:请勿使用Md5()
作为密码。尝试使用password_hash()
和password_verify()
Reference link
注册时使用password_hash()来对密码进行哈希并将其存储在数据库中,并在登录时使用password_verify()来验证这样的密码。Reference link
答案 4 :(得分:-2)
你需要添加session_start();在每个页面中获取会话变量。
答案 5 :(得分:-2)
您必须在尝试使用会话变量的文件中调用session_start()函数。