Проблемы с Login.php

Alex641

Пользователь
Регистрация
22.04.14
Сообщения
4
Реакции
0
Баллы
1
Код:
<?php
session_start();
$conection = mysqli_connect("<login for database and sql)");
if(isset($_POST["submit"]))
$username=$_POST['username'];
$password=$_POST['password'];
$username = stripslashes($username);
$password = stripslashes($password);
$result = mysqli_query($connection, "SELECT * FROM usertbl WHERE username='$username' and password='$password'");
$row=mysqli_fetch_array($result);
if(mysqli_num_rows($result) == 1)
{
$_SESSION['username'] = $login_user; // Initializing Session
header("<succes>"); // Redirecting To Other Page
}else
{
$error = "<failure>";
}
?>

PHP:
this doesnt work, and at this point losing my patience (after solving a lot of problems, still got a few)
Проблемы с Login.php


Warning: mysqli_query() expects parameter 1 to be mysqli, null given in /home/u470788761/public_html/login.php on line 16

Warning
: mysqli_fetch_array() expects parameter 1 to be mysqli_result, null given in /home/u470788761/public_html/login.php on line 17

Warning
: mysqli_num_rows() expects parameter 1 to be mysqli_result, null given in /home/u470788761/public_html/login.php on line 19



could somebody tell me what is wrong? (and if possible fix it)
 

Евгений4

Пользователь
Регистрация
29.12.11
Сообщения
4
Реакции
0
Баллы
1
Это был пример, сэр.... Но я еще не узнал об этом операторе подготовленных запросов... Спасибо за это, сегодня я узнал новое... Я использую центральный index.php и mysqli для всех запросов что входит.
 

ridethewildwind

Пользователь
Регистрация
01.01.70
Сообщения
2
Реакции
0
Баллы
1
Адрес
в России
Мне нужно обратиться к @ketting00, переключиться на PDO.

Я бы также НЕ использовал имя пользователя в качестве того, что вы храните в сеансе. Имена — это строки, строки запрашиваются медленнее, когда пришло время получить больше информации, чем просто имя пользователя, при поиске в базе данных. Вот почему вам следует хранить идентификатор.

ТОЛЬКО возвращайте идентификатор из запроса пароля и старайтесь НИКОГДА не возвращать пароль в любом другом запросе. Лучше всего хранить весь трафик паролей в одном направлении К базе данных, чтобы снизить вероятность утечки пароля. Таким же образом вам, вероятно, следует закодировать пароль с помощью хеша, например sha256, sha512 или Whirlpool, ПЕРЕД отправкой его в базу данных, поскольку НИКОГДА не следует хранить необработанные незашифрованные обратимые пароли в БД. Вот почему восстановление пароля должно заключаться в том, чтобы заставить их создать новый, а НЕ в восстановлении старого!

Вам также следует проверить, существуют ли ВСЕ значения $_POST, а не только одно. У меня, вероятно, был бы скрытый ввод «от» с разными значениями триггера, но это потому, что я сторонник «одного индекса, чтобы управлять ими всеми», поскольку это означает единую точку входа для ВСЕХ пользовательских доступов.

Я бы также потерял это перенаправление - я просто не понимаю, почему люди делают это, как будто слишком сложно связать хеш с сеансом и сделать его недействительным... но с другой стороны, я СНОВА человек типа "один индекс" парня, так на что же я сам перенаправляюсь?

Это немного свободно, но примерно то, что у меня было бы:
Код:
<?php
session_start();
session_regenerate_id(); // reduce window for MitM attack
$db = new PDO(
'mysql:dbname=database;host=localhost',
'username',
'password'
);
if (
isset($_POST['from']) &&
$_POST['from'] == 'login' &&
isset($_POST['username']) &&
isset($_POST['password'])
) {
$stmt = $db->prepare('
SELECT id
FROM users
WHERE username = :username
AND password = :password
');
$stmt->execute([
':username' => $_POST['username'],
':password' => hash('sha256', $_POST['password'])
]);
$_POST['password'] == ''; // prevent anything else from intercepting this!
if ($_SESSION['userId'] = $statement->fetchColumn()) {
} else {
}
} else {
}
Код (разметка): Ну, не совсем так, потому что я бы ловил вещи немного по-другому.
 

erUkraine

Пользователь
Регистрация
01.01.70
Сообщения
3
Реакции
0
Баллы
1
да, ну, это не позволяло мне использовать обычный MySQL (мой хост не позволял этого)
И я знаю, что код может быть отстойным, поскольку я всего лишь студент, пытающийся изучить этот материал (и совершающий ошибки на этом пути).
в какой-то момент я заставил этот код работать, перенаправляя на страницу , но он также перенаправлялся на страницу , хотя это должна быть страница .
 

goldenline

Пользователь
Регистрация
23.02.12
Сообщения
3
Реакции
0
Баллы
1
Нет ничего плохого в том, что вы новичок в этом деле, я просто говорю, что в вашем коде есть несколько ошибок. Обычно я не очень заинтересован в предоставлении правильных примеров кода (@deathshadow, с другой стороны, делает это часто), но для этого, если вы правильно используете mysqli_, это будет выглядеть примерно так:
Код:
<?php
session_start();
$mysqli = new mysqli("localhost","username","password","database");
if (mysqli_connect_errno()) { echo "Connect failed: ".mysqli_connect_error(); exit();
}
if (isset($_POST["submit"])) { if ($stmt = $mysqli->prepare("SELECT * FROM usertbl WHERE username = ? AND password = ?")) { $stmt->bind_param('ss',$_POST['username'],$_POST['password']) if (!$stmt->execute()) { trigger_error('Error executing MySQL query: '.$stmt->error()); } if ($stmt->num_rows() == 1) { $_SESSION['username'] = $_POST['username']; header('location: success'); } else { header('location: error'); } }
}
?>
PHP: здесь используется объектно-ориентированная версия mysqli, которая обычно лучше, поскольку на самом деле она не позволяет вам использовать обратное кодирование, например, включение пользовательского ввода непосредственно в запрос и тому подобное (это, конечно, возможно, но требует немного больше работа).

Не тестировалось, поэтому может не работать (я не использую mysqli_, я использую PDO, который считаю более надежным и простым в работе)
 

Livine545

Пользователь
Регистрация
11.11.12
Сообщения
3
Реакции
0
Баллы
1
Ваша переменная подключения неверна. Это $connection, когда он определен, и (правильно) $connection, когда он используется.
Кроме того, этот код довольно плох и полностью игнорирует причину использования mysqli вместо mysql — тот факт, что вы можете использовать подготовленные запросы.
 

bmw850

Пользователь
Регистрация
15.08.11
Сообщения
3
Реакции
0
Баллы
1
Возврат меньшего количества данных происходит быстрее, но это не настоящая причина. У вас уже есть имя пользователя, зачем его повторять? Я имею в виду, если оно совпадает, то оно совпадает. Что касается пароля, вам НИКОГДА не следует извлекать значение, хранящееся в базе данных, по соображениям безопасности. ЛЮБОЙ запрос, который вы создаете и который идет где-то РЯДОМ с этой информацией, должен быть однонаправленным. Отправка значения в sql для проверки и даже НЕ ПЫТАНИЕ получить значение на стороне кода. Следовательно, почему сразу после выполнения этого запроса я бы даже удалил содержимое $_POST['password'], как только закончил с ним, на всякий случай. (ха, я сделал это в примере выше, даже не задумываясь об этом!)

Вот почему при входе в систему я перехватываю и проверяю еще до того, как позволю чему-либо вывести информацию о результатах.

Причина, по которой я не стал бы перенаправлять, заключается в том, что я склонен использовать метод под названием «один индекс, чтобы управлять ими всеми» - так же, как Голлум с сигналящим кольцом матери, я использую ОДИН index.php для всех запросов страниц.

Но даже если бы я не был чем-то вроде ловушки входа в систему, я бы имел это на КАЖДОЙ странице системы PHP (один индекс делает это проще), так что успех или отсутствие успеха вы можете просто перейти к поставленной задаче, а не бездельничать. с редиректами. У меня даже не было бы отдельного «login.php», поскольку мой include('user.php') перехватывал бы попытку входа в систему, в случае неудачи загрузил бы неудачное сообщение и снова отобразил бы меню на ТО ЖЕ URL-адресе, если бы не попытка входа в систему. посмотрите, вошел ли пользователь в систему через свой идентификатор сеанса, если он установлен, извлеките любую информацию о пользователе, которая может понадобиться странице, а затем просто покажите действие/страницу, на которой он уже был. Для этого вам не нужно перенаправление.

Единственное, что может дать вам перенаправление, — это избежать случайной повторной отправки, но именно здесь отправка случайного хэша в форме и сравнение его с хешем в сеансе, а затем аннулирование хеша в сеансе при каждом запросе предотвращает это — и в целом масса других гадостей.

Это делается ДЛЯ ВАС, если вы используете PDO или mysqli с подготовленными запросами - черт возьми, именно эта причина является частью того, почему вы НЕ должны использовать функции mysql_ и ПОЧЕМУ вы должны использовать подготовленные запросы ВСЕГДА, когда вы помещаете переменную в запрос. Если вы добавите переменную в строку запроса, вы все сделаете неправильно!

Вот почему вся эта ерунда с регулярными выражениями вообще не нужна... тем более MD5? ДЕЙСТВИТЕЛЬНО? Передавай от меня привет Мистеру Радужному Столу!
 

JohnGolt

Пользователь
Регистрация
11.04.15
Сообщения
3
Реакции
0
Баллы
1
проблема в том, что я не совсем понимаю PDO, поэтому с ним невозможно работать, если мне когда-нибудь понадобится что-то изменить.
Итак, если мне не следует никуда перенаправляться, что произойдет после успешного входа в систему? (это не сарказм, я просто не знаю, что мне делать вместо перенаправления)
 

Сергей299

Пользователь
Регистрация
01.04.13
Сообщения
5
Реакции
0
Баллы
1
Хм. Это говорит о том, что бит заголовка не работает должным образом. У вас включен display_errors?
Если нет, добавьте это в файл login.php в начале:
Код:
ini_set('display_errors',1);
error_reporting(E_ALL);
PHP: Это должно показать вам любые возникающие ошибки PHP.
 

=WS=Vjik

Пользователь
Регистрация
03.07.08
Сообщения
3
Реакции
0
Баллы
1
Возраст
44
спасибо за переработку кода!
он не выдал мне никаких ошибок, он просто показывает белый экран со строкой «/login.php» в адресной строке (конечно, после заполнения всех пустых мест, которые вы мне оставили)
 
Сверху Снизу