Roman_Romanov
@Roman_Romanov
symfony

PHP регистрация. Правильный ли ход мыслей?

Пишу для практики небольшой новостной сайт. Пока на стадии написания авторизации. Суть у меня пока такая: Есть главный файл index.htm в нем только форма для входа и одновременно(пока) для регистрации, в поля вводятся пара логин/пароль, проверяется наличие данной пары в бд, если нету то записывается. Использовал сессию для сохранения вводимых данных, в show.htm просто пока для себя отображаю, что было введено пользователем, проверка входных параметров в этом же файле. Оцените по возможности. Укажите на ошибки, дайте какое - нибудь наставление или натолкните на правильную мысль.) Файлы пхп разместил в отдельной директории. В Htm файлах стараюсь только подключать нужные файлы. Оцените код)
index.htm
<!DOCTYPE HTML>
<html>
<head>
	<meta http-equiv="content-type" content="text/html" />
	<meta name="author" content="admin" />
	<title>вход</title>
</head>
<body>
    <form action="php/session.php" method="post">
        <label>Логин:<br /><input type="text" name="login" value="<?php echo filter_var($_SESSION['login'], FILTER_SANITIZE_SPECIAL_CHARS); ?>" /><br /></label>
        <label>Пароль:<br /><input type="password" name="pass" value="<?php echo filter_var($_SESSION['pass'], FILTER_SANITIZE_SPECIAL_CHARS); ?>" /><br /></label>
        <label>Почта:<br /><input type="text" name="email" value="<?php echo filter_var($_SESSION['email'], FILTER_SANITIZE_EMAIL); ?>" /><br /></label>
        <label><button type="submit">Войти</button></label>
    </form>
</body>
</html>

php/session.php
<?php
session_start();
$whitelist = array(
        'login' => 'login',
        'pass' => 'pass',
        'email' => 'email'
);
$incoming = array_keys(array_intersect_key($_POST, $whitelist));
foreach($whitelist as $key){
    $_SESSION[$key] = $_POST[$key];
}
header('Location: show.htm');

php/users.php
<?php
$SelectFromDb = "SELECT * FROM people WHERE name = '$login'";
    $res = mysqli_query($mysqli,$SelectFromDb);
    $num = mysqli_num_rows($res);
        if($num == 0){
    $querry = "INSERT INTO people(name, pass, email) VALUES('$login', '$pass', '$email')";
    $result = mysqli_query($mysqli, $querry) or die("Ошибка записи!");
        }
        else {
            echo "Ошибка записи в БД! Данный логин уже существует!";
        }

php/show.htm
<?php
session_start();
$login = filter_var($_SESSION['login'], FILTER_SANITIZE_SPECIAL_CHARS);
$pass = filter_var($_SESSION['pass'], FILTER_SANITIZE_SPECIAL_CHARS);
$email = filter_var($_SESSION['email'], FILTER_SANITIZE_EMAIL);
require_once ('db.php');
?>
<!DOCTYPE HTML>
<html>
<head>
	<meta http-equiv="content-type" content="text/html" />
	<meta name="author" content="admin" />
	<title>Результат</title>
</head>
<body>
<table>
    <tr>
        <?php echo $login; ?>
    </tr>
    <tr>
        <?php echo $pass; ?>
    </tr>
    <tr>
        <?php echo $email; ?>
    </tr>
</table>
    <form action="../index.htm" method="post">
        <input type="hidden" name="login" value="<?php echo $login; ?>" />
        <input type="hidden" name="pass" value="<?php echo $pass; ?>" />
        <input type="hidden" name="email" value="<?php echo $email; ?>" />
        <button type="submit">Редактровать</button>
    </form>
<?php require_once('users.php'); ?>
</body>
</html>
  • Вопрос задан
  • 1102 просмотра
Решения вопроса 1
skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.
в поля вводятся пара логин/пароль, проверяется наличие данной пары в бд, если нету то записывается

Так себе подход. Нет, где-то он работает, но его надо очень с умом применять. А так у вас пользователи понарегают учёток и будут удивляться, почему настройки пропадают.
foreach($whitelist as $key){
    $_SESSION[$key] = $_POST[$key];
}

Посмотрите в сторону filter_input с фильтром по нужному типу данных, если хотите пока без фреймворков поковыряться.

И почему весь PHP в HTML-файлах?

header('Location: show.htm');
Учитывая, что вы ничего не выводили здесь, то можно, например, без редиректа просто выполнить нужную логику и показать другую страницу. Впрочем, разница между вариантами будет невелика, так что можете и так оставить.
$SelectFromDb = "SELECT * FROM people WHERE name = '$login'";

Привет, SQL-инъекции! Фильтруйте, как я выше говорил, ввод. Лучше пользуйтесь подготавливаемыми запросами и биндингом параметров - там данные буду обезопашены. А вообще лучше используйте PDO (не забывая о подготовленных запросах и биндинге параметров).
Это по поводу первых трёх блоков кода.
В целом, настоятельно рекомендую ознакомиться со стандартами PSR, и прочитать (осознав) PHP The Right Way (там есть перевод, если надо).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
twobomb
@twobomb
Не рекомендую хранить пароли в исходном виде. При добавлении пароля в базу используйте функцию md5($pass)
Ответ написан
Комментировать
Roman_Romanov
@Roman_Romanov Автор вопроса
symfony
2 - ую строку в users.php исправил на
$SelectFromDb = "SELECT * FROM people WHERE name = '". $login . "'";
session_start(); //добавил в index.htm
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы