Introducci贸n a la autorizaci贸n

En el episodio anterior, agregamos soporte para leer todas las notas creadas por un usuario en particular. Pero, al hacerlo, introdujimos sin darnos cuenta un importante problema de seguridad. En esta lecci贸n, analizaremos la autorizaci贸n, los c贸digos de estado y los n煤meros m谩gicos.

Que aprenderemos

  • Autorizaci贸n
  • C贸digos de Status
  • Numero M谩gicos

En el episodio anterior, agregamos soporte para leer todas las notas creadas por un usuario en particular. Pero, al hacerlo, introdujimos sin darnos cuenta un importante problema de seguridad. En esta lecci贸n, analizaremos la autorizaci贸n, los c贸digos de estado y los n煤meros m谩gicos.

Ahorita tenemos un problema con el sistema, ya que si pasamos un id de una nota que no fue escrita por usuario 1, nos la despliega tambi茅n. Ejemplo: http://localhost:8888/note?id=3, nos despliega la nota que fue escrita por otro usuario.

Un primer intento de solucionar esto es, en el controlador encargado de mandar la informaci贸n para que la nota sea desplegada, podemos constringir el query para que user_id sea igual al usuario actual. En controllers/note.php

<?php 

$config = require('config.php');
$db = new Database($config['database']);

$heading = 'Nota';
$currentUserId = 1;

// dd($_GET['id']); // verificar que tenemos el id de la nota correcto
$note = $db->query('SELECT * FROM mis_notas.notes WHERE id = :id', [
                'id' => $_GET['id']
            ])->fetch();
// dd($note);

if (! $note){
    abort(Response::NOT_FOUND);
}

if ($note['user_id'] != $currentUserId){
    abort(Response::FORBIDDEN); //la nota fue encontrada pero no esta escrita por usuario 1
}

require "views/note.view.php";

Por lo pronto estamos grab谩ndolo en c贸digo duro que el usuario es el 1.

En views/403.php

<?php require('partials/head.php') ?>
<?php require('partials/nav.php') ?>

<main>
    <div class="mx-auto max-w-7xl py-6 sm:px-6 lg:px-8">
        <h1 class="text-2xl font-bold">No autorizado para ver esta nota!</h1>
        <p class="mt-4">
            <a href="/" class="text-blue underline">Regresar a inicio.</a>
        </p>   
    </div>
</main>

<?php require('partials/footer.php') ?>

En Response.php

<?php 

class Response {
    const NOT_FOUND = 404;
    const FORBIDDEN = 403;
}

En index.php

<?php 

require 'display_errors.php';

require 'functions.php';
require 'Database.php';
require 'Response.php';
require 'router.php';

Finalmente para poder desplegar los errores que nos manda el servidor de PHP incluir este c贸digo en display_errors.php

<?php 

// https://stackify.com/display-php-errors/
// The quickest way to display all php errors and warnings is to add these lines to your PHP code file:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Listo!