Забрана на директен достъп до файл

mano

Registered
Здравейте,

ползвам следния код за редиректване на потребител след логин към различни страници в зависимост от това какъв е потребителя.

Искам обаче да защитя отделните страници като main.php и users.php от директен достъп. Идеята е да минават задължително през логин формата, която е в index.php

Някакви идеи как да го направя ?

PHP:
<?php

include("config.php");
session_start();
$conn1 = mysql_connect($host, $user, $pass);
if (!$conn1) {
    die('Could not connect: ' . mysql_error());
}

$db = mysql_select_db($db, $conn1);

if ($_POST['username'] && $_POST['password']) {
                $username = ($_POST['username']);
                $password = md5($_POST['password']);
                $isAdmin = mysql_query("SELECT login FROM users WHERE login = '$username' AND admin = '1'");
                if(mysql_num_rows($isAdmin) == 1) {
                                header("Location: main.php");
                                exit;
                }
                $res = mysql_query("SELECT login FROM users WHERE login = '$username' AND pass = '$password'");
                if(mysql_num_rows($res) == 1) {
                                $_SESSION['username'] = $username;
                header("Location: users.php");

                                exit;
                } else {
                                header("Location: opps.php");
                }
}
?>
 

eddyy93

Registered
На всякъде където искаш да си логнат за да ползваш нещо си му правиш една IF проверка.

PHP:
if(isset($_SESSION['username'])) {

//Кода където ще искаш даден потребител да вижда след като се е логнат в сайта.

}
else {echo 'Моля логнете се';}
 

relax4o

Registered
Няма смисъл от този начин. Това се прави така:

PHP:
<?php
session_start();

if(!isset($_SESSION['logged'])){
        header("Location: index.php");
        exit;
}

//Надолу сайта
 

eddyy93

Registered
:shock: и каква е разликата ... освен header();


Ами примерно искаш да защитиш само, част от даден код от страница твоя код няма да върши работа.
 

relax4o

Registered
Разликата не е само в header(). Виж разликите хубаво, между твоя и моя код.
Кажи ми една основателна причина, автора, да слага целия HTML код в блок (между къдрави скоби), като просто условието може да се обърне и да е единствено, вместо да се слага и else блок.

Колкото до втория въпрос: ако автора иска да "закрие" част от кода, ще направи вътрешна проверка за дадените елементи. А колкото до това, че моя код няма да помогне, мога да ти отвърна, че за това и твоя код няма да помогне.

В моя случай чете if-a и ако върне true условието си го връща на index.php, иначе кода си продължава чисто на долу.



Добра практика
PHP:
<?php
session_start();
if(!isset($_SESSION['logged'])){
          header("Location: index.php"); //или нещо друго
          exit; 
         //прекъсваме всичко надолу, за да предотвратим
         // продължително зареждане на страницата
         
         //може да се ползва и само exit, но лично препоръчвам
         //връщането в началната страница       
}
?>

Лоша практика
PHP:
<?php
session_start();
if(isset($_SESSION['logged'])){
         //бухаш целия код в блока
}
else{
        //връщаш грешка или препращаш
}
?>


Ако се вкара малко логика ще се разбере защо моя пример е по-оптимизиран.
 

mano

Registered
Много благодаря и на двамата, работи идеално, но има един проблем. В едната страница искам да може да влизат само потребители, имат 1 (единица) в полето админ в базата данни. Останалите (с флаг 0) не трябва да отварят страницата, която е за онези с флаг 1.

Надявам се да съм бил ясен.

Оправих го, благодаря ви много.

$_SESSION['admin']

$_SESSION['user']
 

Горе