> For the complete documentation index, see [llms.txt](https://g4b0.gitbook.io/g4b0-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://g4b0.gitbook.io/g4b0-docs/documentation/hacking-web/sql/mitigando-sql-injection.md).

# Mitigando SQL Injection

La última sección: cómo **prevenir y parchear** las inyecciones que acabas de aprender a explotar. Hay varias capas de defensa, y la idea es combinarlas.

**1. Input Sanitization (sanitización)**

El código vulnerable mete el input directo en la query:

```php
$query = "SELECT * FROM logins WHERE username='".$username."' AND password='".$password."';";
```

La solución es **escapar** los caracteres especiales para que `'` y `"` pierdan su significado especial. En PHP/MySQL se usa `mysqli_real_escape_string()`:

```php
$username = mysqli_real_escape_string($conn, $_POST['username']);
$password = mysqli_real_escape_string($conn, $_POST['password']);
```

Así la inyección de comillas ya no funciona. (El equivalente para PostgreSQL es `pg_escape_string()`.)

**2. Input Validation (validación)**

Verificar que el input **coincide con el formato esperado**. Si un `port_code` solo puede tener letras y espacios, restringes con una expresión regular y rechazas todo lo demás:

```php
$pattern = "/^[A-Za-z\s]+$/";
if(!preg_match($pattern, $code)) {
  die("Invalid input! Please try again.");
}
```

Cualquier payload con comillas o caracteres raros se corta antes de llegar a la query.

**3. User Privileges (mínimo privilegio)**

El usuario que la app usa para consultar la base **nunca** debe ser superusuario o admin. Le das solo los permisos mínimos que necesita:

```sql
CREATE USER 'reader'@'localhost';
GRANT SELECT ON ilfreight.ports TO 'reader'@'localhost' IDENTIFIED BY 'p@ssw0Rd!!';
```

Así, aunque exista una inyección, ese usuario no puede tocar otras tablas (`credentials`), ni leer/escribir archivos, ni enumerar todo el DBMS. Limita el daño.

**4. Web Application Firewall (WAF)**

Detecta y rechaza requests con input malicioso, **incluso si la lógica de la app es defectuosa**. Pueden ser open-source (ModSecurity) o premium (Cloudflare). Traen reglas por defecto — por ejemplo, cualquier request con `INFORMATION_SCHEMA` (muy usado en SQLi) se bloquea.

**5. Parameterized Queries (la más sólida)**

En vez de concatenar el input en la query, usas **placeholders** (`?`) que el driver escapa y rellena por separado. El dato nunca se interpreta como código:

```php
$query = "SELECT * FROM logins WHERE username=? AND password=?";
$stmt = mysqli_prepare($conn, $query);
mysqli_stmt_bind_param($stmt, 'ss', $username, $password);
mysqli_stmt_execute($stmt);
```

Los `?` separan estructura de datos: aunque el usuario meta `' OR '1'='1`, se trata como texto literal, no como SQL.

**Conclusión**

Ninguna capa por sí sola es infalible — según la lógica de la app, todavía podría haber huecos. Por eso se aplican **en conjunto** (defensa en profundidad). Y aunque los ejemplos son en PHP, la lógica aplica a cualquier lenguaje y librería.

Con esto cierras toda la parte de SQL Injection del módulo. 🎉 Recorriste el ciclo completo: desde entender qué es una inyección, pasando por auth bypass, comentarios, UNION, enumeración con `INFORMATION_SCHEMA`, lectura/escritura de archivos, web shell con RCE, y ahora cómo defenderse de todo eso. Esa última parte no es relleno — entender las mitigaciones te hace mejor atacante (sabes qué buscar para evadirlas) y es justo lo que esperan que sepas explicar en un reporte de pentest.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://g4b0.gitbook.io/g4b0-docs/documentation/hacking-web/sql/mitigando-sql-injection.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
