A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Curso de PHP con Laravel

Curso de PHP con Laravel

H茅ctor Benitez

H茅ctor Benitez

CSRF

15/25
Recursos

CSRF (Cross-site request forgery) es un tipo de ataque que consiste en que un usuario puede intentar hacer muchas peticiones en nombre de otro. Para esto Laravel genera con cada sesi贸n un token que se usar谩 para validar que exista el usuario en el sistema y que sea 茅l quien est谩 haciendo la petici贸n. Esto tambi茅n implica que no se pueden hacer peticiones desde otra app hacia el post, debe manejarse de manera interna.

Si queremos que un form pueda pasar la seguridad CSRF de Laravel, debemos agregar el helper @csrf el cual nos agrega un token.

  • Cuando estamos guardando nuevas entradas en la base de datos podemos redireccionar adonde queramos en nuestra aplicaci贸n con una respuesta especial de Laravel llamada redirect.

Estamos trabajando con Middlewares los cuales son muy usados en aplicaciones web que consisten en capas que contienen el request. Cuando llega un request, 茅ste deber谩 pasar por diferentes capas o filtros (middlewares) quienes al final regresar谩n una respuesta. Cada uno de los filtros puede detener las peticiones en caso de que algo no cumpla.

Si no se desea usar la protecci贸n CSRF se puede directamente quitar el middleware desde el archivo kernel.php. De la misma manera se pueden crear middleware propios y agregarlos aqu铆.

Aportes 27

Preguntas 3

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

En vez de responder una redirecci贸n de url, para adaptarnos al funcionamiento de laravel y sus buenas pr谩cticas, podemos realizar una redirecci贸n de vista, por ejemplo:

    return redirect()->route('expense_reports.index');

驴como hago para poner mi pagina en mantenimiento con middleware?

Les comparto el link de la documentaci贸n de CSRF desde la p谩gina oficial de Laravel.
https://laravel.com/docs/7.x/csrf

Mi formulario para dar de alta un cliente. Incluye una peque帽a ventana modal de confirmaci贸n hecha con Bootstrap:

@extends('layouts.form')

@section('title', 'Nuevo Cliente')

@section('table_name', 'clients')

@section('form_content')
<form action="/clients" method="POST">

  @csrf

  <div class="form-group">
    <label for="client_name">Raz贸n Social</label>
    <input type="text" class="form-control" id="client_name" name="client_name" aria-describedby="nameHelp" placeholder="EMPRESA, S. A. DE C. V.">
    <small id="nameHelp" class="form-text text-muted">Ingresar en may煤sculas tal como aparece en el RFC.</small>
  </div>

  <div class="form-group">
    <label for="client_nickname">Alias</label>
    <input type="text" class="form-control" id="client_nickname" name="client_nickname" aria-describedby="nicknameHelp" placeholder="EMPRESA">
    <small id="nicknameHelp" class="form-text text-muted">El alias es empleado para vistas compactas y la generaci贸n de nombres de carpetas.</small>
  </div>

  <div class="form-group">
    <label for="client_custom_location">Domicilio Fiscal</label>
    <input type="text" class="form-control" id="client_custom_location" name="client_custom_location" aria-describedby="locationHelp" placeholder="CALLE, No, LOCALIDAD, CIUDAD, ESTADO">
    <small id="locationHelp" class="form-text text-muted">La ubicai贸n tal como desee que aparezca en los informes.</small>
  </div>

  <!-- Button trigger modal -->
  <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModalCenter">
    Guardar
  </button>

  <!-- Modal -->
  <div class="modal fade" id="exampleModalCenter" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
    <div class="modal-dialog modal-dialog-centered" role="document">
      <div class="modal-content">
        <div class="modal-header">
          <h5 class="modal-title" id="exampleModalCenterTitle">Advertencia</h5>
          <button type="button" class="close" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true">&times;</span>
          </button>
        </div>
        <div class="modal-body">
          驴Esta seguro que desea guaradr los cambios?
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancelar</button>
          <button type="submit" class="btn btn-primary">Guardar</button>
        </div>
      </div>
    </div>
  </div>
</form>
@endsection

Apuntes:
Para prevenir ataques de CSRF (acr贸nimo de Cross-Site Request Forgery), es un tipico ataque en el que el atacante hace multiples peticiones a nombre de otro atacante, por lo que Laravel trae proteccion ante este tipo de ataques a partir de un token, para ello debemos escribir dentro de la etiqueta de formulario 鈥楡csrf鈥.
Para proceder a guardar definitivamente los datos en la base de datos, escribimos en el metodo store():
- $variableSave = new ClaseModelo();
- $variableSave->atributo = $request->get(鈥榥ameFOrmulario鈥);
- $variableSave->save();
- return redirect(鈥/rutaDeseada鈥);
El metodo redirect(), es para redireccionarnos a otra vista, una vez que guardemos los datos.
Los middleware son capas que contienen al request y lo validan, cuando llega algun tipo de request, este tiene que pasar por multiples filtros para llegar a su destino (response). Cualquiera de estos filtros puede detener las peticiones.

Vale la pena aclarar que si estamos utilizando Form::open() para crear los formularios (por consiguiente al usar tambi茅n sus m茅todos para crear los controles), 茅ste viene con el @csrf incorporado; lo quiere decir que no es necesario llamar a la directiva para realizar este tipo de validaci贸n especial (de hecho crea el _token de forma autom谩tica).

estoy usando visual code como puedo agregar los prefijos "key "

si yo quiero consumir una api ella en laravel como manejo lo de los tokens dado que las peticiones vienen de distintos servidores

Todo va perfecto.

Super 馃槂

Excelente el uso del CSRF

en mi formulario no da ningun error cuando no le pongo @csrf 驴por que?

Tengo una tabla personas y otra empleados que estan relacionadas, en un form tengo los datos de la persona y los datos del empleado para darlos de alta, lo correcto es guardar la informacion en persona y el id que me da despues de guardarlo debo de relacionarlo en el campo idpersona dentro de la tabla de empleado, como puedo hacerlo?

        $report = new Persona();
        $report->nombre= $request->get('nombre');
        $report->estatus=1;
        $report->save();
      
	$report = new Empleado();
        $report->numEmpleado= $request->get('empleado');
        $report->idPersona=???;
        $report->save();


Si usan phpstorm les aparecera Key: si usan visual studio code no aparecera esta.

Tengan cuidado de este detalle al codear

Bien

Buena clase, aunque es mas b谩sico y sencillo que el anterior, para quienes apenas comienzan a usar Laravel les ser谩 mas f谩cil de entender

Al parecer no me reconoce el @csrf lo vizualiza como texto en la pagina

Hola, Cu谩l es la diferencia entre usar $request->get(鈥榢ey鈥) y $request->key ? Gracias

para protegernos de ataques de CSRF colocamos el 鈥淍csrf鈥 que nos ofrece laravel. es esta clase podemos ver como se evita este ataque y tambi茅n como cargar la bd y de como implementar algunos middlewares.

En el m茅todo store, cuando ya nuestra vista envia todos los valores y no necesitamos ninguna otra confirmaci贸n, hacemos un $model->create($request);

Excelente el curso, por fin entendi lo del token CSRF!

me da el siguiente error al darle al boton de submit

Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException The POST method is not supported for this route. Supported methods: GET, HEAD, PUT, PATCH, DELETE.

驴C贸mo se realiza el manejo de tokens si Laravel est谩 siendo usado 煤nicamente como Backend API y las peticiones externas pueden venir de diferentes fuentes (Clientes web, App m贸vil etc)?

Notas:

  • Ataques CSRF que significa Cross-Site Request Forgery, son ataques donde un usuario podria estar haciendo peticiones en nombre de otro usuario.

  • Para validar que un usuario es el mismo que esta haciendo la peticion y no otro usamos los tokens que generan laravel en cada sesion implementando el helper 鈥淍csrf鈥 dentro de la etiqueta formulario.

  • En este caso para generar un nuevo registro en la base de datos, hacemos uso de la accion Store que esta en el controller, recibiendo los parametros que vienen en request obteniendolos con la funcion de laravel get() luego redireccionamos con el metodo redirect() hacia la vista donde estamos listando los resultados.

+Teoria:
Se usan Middlewares los cuales son muy usados en aplicaciones web que consisten en capas que contienen el request. Cuando llega un request, 茅ste deber谩 pasar por diferentes capas o filtros (middlewares) quienes al final regresar谩n una respuesta. Cada uno de los filtros puede detener las peticiones en caso de que algo no cumpla.

en verdad es buena practica utilizar ->get() ??
porque no lo veo en la documentaci贸n no seria mejor usar ->input() ???

Si por alguna raz贸n se est谩 usando una versi贸n de laravel inferior, por ejemplo 5.0.16, que es mi caso porque tengo PHP 5.5 no funciona el helper

@csrf()

Se puede usar de forma manual de la siguiente manera

<input type="hidden" name="_token" value="{{ csrf_token() }}">

CSRF: Cross-Site Request Frogery, es un m茅todo de ataque que sirve para falsificar peticiones HTTP, Laravel provee una forma segura de lidiar contra ello y es con el helper @csrf

Una forma m谩s f谩cil de crear registros es con el m茅todo 鈥渃reate鈥, es un m茅todo m谩s seguro, pero para eso necesitas configurar una propiedad $fillable dentro de tu modelo.

No es recomendable desactivar la validaci贸n CSRF, sin embargo, hay veces que necesitamos quitarla en ciertas rutas (Por ejemplo cuando queremos recibir webhooks), para eso Laravel igual provee ciertas formas de quitar la validaci贸n CSRF para rutas especificas.