Nem sempre podemos contar com a integridade dos usuários que utilizam o nosso site ou plataforma, e se um usuário mal intencionado acessar o seu site, sem as corretas validações, você pode enfrentar vários problemas, de vazamento de dados, até um completo shutdown no seu sistema. Então vamos aprender como trabalhar com validações aqui.
Vamos imaginar que temos essas rotas no nosso sistema:
use App\Http\Controllers\UserController;
Route::get('/user', [UserController::class, 'create']);
Route::post('/user', [UserController::class, 'store']);
e nossa tabela no banco de dados tem esse modelo:
id | name | mobile | role | |
---|---|---|---|---|
fd9f5d6b0940 | James Oliver | james@example.com | 01093131312 | admin |
928667699a0c | Claudia Moreira | claudia@myweb.com | 01294912912 | user |
e22334d2778e | Patricia Tavares | patricia@domain.com | 01291012921 | editor |
A rota GET
exibirá um formulário para o usuário criar um novo projeto, enquanto a rota POST
irá armazenar o novo projeto no banco de dados.
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function create()
{
return view('user.create');
}
// Registra o usuario no banco de dados
public function store(Request $request)
{
User::create([
$request->all()
]);
}
}
Porque o código acima é uma idea terrível?
Simplesmente por que nesse cenário você da total liberdade para o usuário, armazenar basicamente qualquer coisa no seu banco de dados.
O usuário pode simplesmente implantar um campo escondido no seu formulário para tentar submeter informação extra. Por exemplo:
<input type="hidden" id="role" name="role" value="admin" />
Imagine algo como o campo acima, assim que o usuário submeter esse formulário, ele vai receber os privilégios de um admin!
O primeiro passo para validação é utilizar o método validate
fornecido pelo objeto Illuminate\Http\Request
. Se as regras de validação passarem, seu código continuará executando normalmente; entretanto, se a validação falhar, uma exceção será lançada e a resposta de erro apropriada será automaticamente enviada de volta para o usuário.
No exemplo acima, podemos utilizar o método validate
diretamente no parâmetro request
.
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function create()
{
return view('user.create');
}
// Registra o usuario no banco de dados
public function store(Request $request)
{
$validated = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|max:80',
'mobile' => 'required|digits:11',
]);
// Os valores dentro da request já estão validados nesse ponto
$validated_with_role = array_merge($validated, ['role' => 'user']);
User::create($validated_with_role);
}
}
O método validate
é bem direto, ele usa uma array associativo onde, as chaves são o que você espera receber na request
e os valores do lado direito são as regras que você quer aplicar para cada campo, individualmente.
Como você pode ver, não estamos validando o campo role
então se um usuário tentar enviar esse valor em uma request, ele vai ser completamente ignorado. Ao invés, estamos passando o role do usuário dentro do controller, completamente fora do alcance do usuário.
Deixe um comentário