Inicio de sesión de administrador y seguridad de carga

Tengo un sitio de cómics en el que me gustaría facilitar la carga de rutas de imágenes a la base de datos.

Tengo una pantalla de inicio de sesión que comprueba como tal las credenciales correctas:

            <?php 

        $username = isset($_POST['username']) ? $_POST['username'] : "";
        $password = isset($_POST['pw']) ? $_POST['pw'] : "";


        if($_SERVER['REQUEST_METHOD'] == 'POST') {
            if(verify($username, $password) == 1) {
                header("Location: ?action=admin");
            }
            else {
                echo "<center>Incorrect credentials</center>";
            }
        }

        function verify($user, $pw) {
            include './scripts/dbconnect.php';

            $result = $mysqli->query("SELECT username, password FROM users WHERE username='" . $user . "' AND password='" . $pw . "'"); 

            return $result->num_rows;
        }

        include 'include/footer.php';
        ?>

Que luego los iniciará en la pantalla de carga.

Desafortunadamente, todo lo que el usuario tiene que hacer es adivinar cuál podría ser mi URL para la página de carga y puede omitir mi pantalla de inicio de sesión...

/HTwS/?action=login (simplemente reemplace 'login' con 'admin' y ya está...) Entonces, mi primera línea de defensa será no hacer que el nombre de mi página de carga sea tan obvio... pero ¿qué sucede? si un usuario aún lo adivina ... ¿puedo verificar de otra manera que no les permita simplemente cambiar la URL?

¡Gracias!

preguntado el 13 de enero de 13 a las 21:01

la forma habitual de hacerlo es hacer que el procedimiento de inicio de sesión cree una variable de sesión que, si no se establece, hará que el usuario sea redirigido a la página de inicio de sesión. -

Es genial que estés usando mysqli. Pero aún eres vulnerable a las inyecciones porque solo estás descargando la entrada directamente en él. -

También podrías usar .htauth, a menos que tenga una docena de administradores. Si y bobby-tables.com -

@maro, ¿es lo mismo que .htaccess? Podría recomendar usar un área protegida con contraseña usando .htaccess -

2 Respuestas

Bueno, esto es bastante inseguro. Lo que querrá hacer es establecer algunas variables de sesión cuando inicie sesión ($_SESSION[user_id], $_SESSION[permission_type], etc...). A continuación, puede tener una función como verifyAdmin() en la parte superior de cada página de administración que verificaría si el usuario que inició sesión es de hecho un administrador al verificar el $_SESSION variables que acaba de establecer. Si no lo están, son redirigidos a la página de inicio de sesión.

Cuando el administrador inicie sesión, configure algunas variables de sesión como tales:

$_SESSION[user_id] = id_of_admin;
$_SESSION[permission_type] = 'admin';

verificarAdmin se vería así:

function verifyAdmin() {
   if(!isset($_SESSION[username]) || !isset($_SESSION[permission_type]) || $_SESSION[permission_type] != 'admin'){
        header("Location: login.php");
    }
}

Luego, en la parte superior de cada página de administración, simplemente puede hacer esto:

verifyAdmin();

Su función de verificación debería verse así:

function verify($user, $pw) {
    include './scripts/dbconnect.php';
    $result = $mysqli -> query("SELECT username, password FROM users WHERE username='" . $user . "' AND password='" . $pw . "'");
    if ($result -> num_rows == 1) {
        $_SESSION[username] = $user;
        $_SESSION[permission_type] = 'admin';
    }
    return $result -> num_rows;
}

Respondido el 16 de enero de 13 a las 15:01

Pensé en hacer eso, pero realmente no estaba acostumbrando a usar las sesiones. ¿Puede proporcionar un breve ejemplo dado mi código sobre cómo integraría una verificación de sesión? - user3871

bien genial Mi desglose en la comprensión es el siguiente: entiendo de dónde obtienen sus valores otras superglobales, como $_POST (que obtiene su valor del envío de un formulario) o $_GET (que obtiene su valor de la URL), pero ¿de dónde obtiene $_SESSION su valor? valor de? ¿De dónde viene el 'user_id' en $_SESSION['user_id']? lo comprobé php.net/manual/en/reserved.variables.session.php para la respuesta, pero todavía no estaba claro. - user3871

Compruebe mi actualización de su función. No necesita usar user_id, solo fue una sugerencia. Puede utilizar el nombre de usuario. Solo algo para validar. - SeanWM

Bien, entonces, ¿una variable $_SESSION generará automáticamente una ID única y almacenará las variables elegidas por el usuario en función de esa ID única? - user3871

Una variable de sesión almacenará los datos que usted le diga que almacene durante el tiempo que una sesión esté activa. $_SESSION[name_of_session_variable] = value_of_session_variable. Puede llamar a esta variable en cualquier momento y en cualquier lugar donde haya comenzado su sesión. - SeanWM

Este fragmento de código también es vulnerable a la inyección de SQL. Necesita desinfectar esas variables $_POST.

Respondido el 13 de enero de 13 a las 22:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.