2016-05-15 4 views
0

Итак, я создал свой первый веб-сайт, который использует регистрацию и вход в систему, и он был реализован с использованием php и mysql. Моя проблема заключается в том, что если пользователь получил URL-адрес страниц, к которым он обращался после прохождения страницы входа в систему, он в настоящее время может копировать и вставлять эти страницы в URL-адрес и обходить логин.Вход и обход экрана входа в систему

ВОПРОС: Есть ли способ гарантировать, что фактический логин состоялся?

Мой хост 000Webhost (бесплатный) позволяет парам защищаться паролем, но я не знаю, как и могу ли я связать это с моей пользовательской базой данных.

Это первый вопрос, который я задал по этому вопросу .. пожалуйста, будьте добрыми.

+0

Опубликовано это ее: http://stackoverflow.com/questions/37234576/php-setting-the-session-information-in-a-cookie-wont-be-keep-after-page-reload – Munsterlander

+0

@Paul помог мне? – Webeng

ответ

1

Да, есть простой способ проверить, зарегистрирован ли пользователь, и наилучшим способом является использование суперклапана $_SESSION. Когда вы используете сеанс superglobal, вы в основном сохраняете информацию на сервере о конкретном пользователе и в то же время сохраняете файл cookie на компьютере пользователя, который однозначно идентифицирует его, пока сессия действительна (обычно 30 минут) , На простом английском языке разработчики php создали суперглобальный компонент, который в основном упростил бы разработчикам «поддерживать состояние» без необходимости делать экстремальные количества кода.

Вот как вы бы использовали сеанс суперглобала. В верхней части каждой страницы вашего сайта, вы бы эту часть кода (даже выше <!DOCTYPE html>):

<?php session_start(); ?> 

Что это делает (среди многих других вещей) является сохранение куки на компьютере пользователя, идентифицирующую он однозначно, пока сессия действительна. СЕЙЧАС ... на странице, что пользователь вводит после входа в систему, вы бы код, подобный следующему:

<?php 

$username = $_POST['username'];//obtaining username from form 
$password = $_POST['password'];//obtaining password from form 
// i did not include any encryption code in this example 
// so that the example is easier to understand, but keep in mind 
// that encrypting your users passwords is super important 

//for security reasons, I used prepared statements and binding parameters 
//to compare the password and username obtained from the form with 
//those in the database (in order to prevent sql injection): 
$sql = "SELECT 1 FROM users WHERE username = :username AND password = :password LIMIT 1"; 
$stmt = $conn->prepare($sql); 
$stmt->bindParam(':username', $username); 
$stmt->bindParam(':password', $password); 
$stmt->execute(); 

if ($stmt->rowCount()>0)//if a row was found, then you know this user exists 
{ 
//here I am saving information in the session super global that 
//can be used to not only identify if a user is logged in on each 
//page, but also to see which user is logged in, since often 
//you want to give a user his own control panel or other features. 
    $_SESSION['authenticated'] = TRUE; 
    $_SESSION['username'] = htmlspecialchars($username); 
} 

?> 

Теперь на каждой странице, что у вас есть, вы бы включать следующий код:

<?php 
if (isset($_SESSION['authenticated'])) 
{ 
    echo "Hello there ".$_SESSION['username']."!<br>"; 
} 
?> 

Предыдущий код затем повторяет что-то вроде «Привет, Джон!». если имя пользователя было John. Отсюда вы можете включить любой код, который вы хотите, в те скобки, которые вы только хотите, чтобы пользователи вошли в систему, чтобы видеть ТАК ПОЛЬЗОВАТЕЛЕЙ, которые не вошли в систему, поэтому не смогут просматривать эту часть веб-сайта, даже если они будут видеть сайты логотип и все остальное, что не находится внутри условия if. Кроме того, предыдущий код не должен быть на самом верху, должен быть только <?php session_start(); ?>, и это связано с тем, как работает протокол HTTP.

Сообщите мне, если это поможет или у вас возникнут другие вопросы.

+0

Хорошо, я тоже это пробовал и получаю следующую ошибку: Неустранимая ошибка: вызов функции-члена prepare() для не-объекта в /home/a4049291/public_html/frontpage.html в строке 14 Строка 14 - $ stmt = $ connection-> prepare ($ sql); Есть ли класс ниже новичка? – Paul

0

В ответе Webeng, приведенном выше, вам больше всего нужно, но вам нужно изучить, как вы создали соединение с базой данных, чтобы вы могли правильно использовать подготовленные заявления. Просмотрите соединения базы данных PDO или mysqli.

Он полностью прав, используя переменные SESSION, чтобы отслеживать, зарегистрирован ли пользователь, и об использовании подготовленных операторов для SQL.

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

if (!isset($_SESSION['username'])) { header("Location: login.php"); } 
Смежные вопросы