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

  • Автор темы Alex641
  • 137
  • Обновлено
  • 16, May 2024
  • #1
 <?php

session_start();

$conection = mysqli_connect("<login for database and sql)");

if(isset($_POST["submit"]))

// Define $username and $password

$username=$_POST['username'];

$password=$_POST['password'];

// To protect from MySQL injection

$username = stripslashes($username);

$password = stripslashes($password);

//Check username and password from database

$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)

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)

Alex641


Рег
22 Apr, 2014

Тем
2

Постов
4

Баллов
24
  • 18, May 2024
  • #2
Это был пример, сэр.... Но я еще не узнал об этом операторе подготовленных запросов... Спасибо за это, сегодня я узнал новое... Я использую центральный index.php и mysqli для всех запросов что входит.
 

Евгений4


Рег
29 Dec, 2011

Тем
0

Постов
4

Баллов
4
  • 22, May 2024
  • #3
Мне нужно обратиться к @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'])

) {

// NEVER return all, particularly the 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()) {

// success handler here

} else {

// failed handler here

}

} else {

// show info that the form was incomplete or invalid

}
Код (разметка): Ну, не совсем так, потому что я бы ловил вещи немного по-другому.
 

ridethewildwind


Рег
01 Jan, 2011

Тем
0

Постов
2

Баллов
2
  • 01, Jun 2024
  • #4
да, ну, это не позволяло мне использовать обычный MySQL (мой хост не позволял этого) И я знаю, что код может быть отстойным, поскольку я всего лишь студент, пытающийся изучить этот материал (и совершающий ошибки на этом пути). в какой-то момент я заставил этот код работать, перенаправляя на страницу , но он также перенаправлялся на страницу , хотя это должна быть страница .
 

erUkraine


Рег
01 Jan, 2011

Тем
1

Постов
3

Баллов
13
  • 03, Jun 2024
  • #5
Нет ничего плохого в том, что вы новичок в этом деле, я просто говорю, что в вашем коде есть несколько ошибок.

Обычно я не очень заинтересован в предоставлении правильных примеров кода (@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, который считаю более надежным и простым в работе)
 

goldenline


Рег
23 Feb, 2012

Тем
1

Постов
3

Баллов
13
  • 07, Jun 2024
  • #6
Ваша переменная подключения неверна. Это $connection, когда он определен, и (правильно) $connection, когда он используется. Кроме того, этот код довольно плох и полностью игнорирует причину использования mysqli вместо mysql — тот факт, что вы можете использовать подготовленные запросы.
 

Livine545


Рег
11 Nov, 2012

Тем
1

Постов
3

Баллов
13
  • 08, Jun 2024
  • #7
Возврат меньшего количества данных происходит быстрее, но это не настоящая причина.

У вас уже есть имя пользователя, зачем его повторять? Я имею в виду, если оно совпадает, то оно совпадает.

Что касается пароля, вам НИКОГДА не следует извлекать значение, хранящееся в базе данных, по соображениям безопасности.

ЛЮБОЙ запрос, который вы создаете и который идет где-то РЯДОМ с этой информацией, должен быть однонаправленным.

Отправка значения в sql для проверки и даже НЕ ПЫТАНИЕ получить значение на стороне кода.

Следовательно, почему сразу после выполнения этого запроса я бы даже удалил содержимое $_POST['password'], как только закончил с ним, на всякий случай.

(ха, я сделал это в примере выше, даже не задумываясь об этом!)

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

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

Но даже если бы я не был чем-то вроде ловушки входа в систему, я бы имел это на КАЖДОЙ странице системы PHP (один индекс делает это проще), так что успех или отсутствие успеха вы можете просто перейти к поставленной задаче, а не бездельничать.

с редиректами.

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

посмотрите, вошел ли пользователь в систему через свой идентификатор сеанса, если он установлен, извлеките любую информацию о пользователе, которая может понадобиться странице, а затем просто покажите действие/страницу, на которой он уже был.

Для этого вам не нужно перенаправление.

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

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

Если вы добавите переменную в строку запроса, вы все сделаете неправильно! Вот почему вся эта ерунда с регулярными выражениями вообще не нужна.

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

bmw850


Рег
15 Aug, 2011

Тем
2

Постов
3

Баллов
23
  • 10, Jun 2024
  • #8
проблема в том, что я не совсем понимаю PDO, поэтому с ним невозможно работать, если мне когда-нибудь понадобится что-то изменить. Итак, если мне не следует никуда перенаправляться, что произойдет после успешного входа в систему? (это не сарказм, я просто не знаю, что мне делать вместо перенаправления)
 

JohnGolt


Рег
11 Apr, 2015

Тем
1

Постов
3

Баллов
13
  • 10, Jun 2024
  • #9
Хм. Это говорит о том, что бит заголовка не работает должным образом. У вас включен display_errors? Если нет, добавьте это в файл login.php в начале:
 
ini_set('display_errors',1);
error_reporting(E_ALL);
PHP: Это должно показать вам любые возникающие ошибки PHP.
 

Сергей299


Рег
01 Apr, 2013

Тем
0

Постов
5

Баллов
5
  • 11, Jun 2024
  • #10
спасибо за переработку кода! он не выдал мне никаких ошибок, он просто показывает белый экран со строкой «/login.php» в адресной строке (конечно, после заполнения всех пустых мест, которые вы мне оставили)
 

=WS=Vjik


Рег
03 Jul, 2008

Тем
1

Постов
3

Баллов
13
Тем
49554
Комментарии
57426
Опыт
552966

Интересно