Protegerme de ataques

  • Autor Autor v0rix
  • Fecha de inicio Fecha de inicio
v0rix

v0rix

Gamma
Programador
Verificación en dos pasos activada
Hola foreros, paso a comentar mi situación.

Estoy realizando una tienda online desde 0 (WooComerce y PrestaShop no se mimetizan a lo que necesito realmente), pero me surge la duda de si alguien puede atacarme la web por SQL Injection u otras técnicas.

Alguien sabe o me puede facilitar técnicas para evitarme estos problemas?
 
Estás utilizando algún framework de PHP para realizar tu tienda? Muchos ya traen protección con SQL Injection, RFI, LFI, XSS, CSRF..
 
Estás utilizando algún framework de PHP para realizar tu tienda? Muchos ya traen protección con SQL Injection, RFI, LFI, XSS, CSRF..

No, estoy haciendola con PHP puro y JavaScript para el carrito.
 
Para protegerte de ataques de inyección SQL debes de usar PDO o MYSQLi.

Ejemplo:
Insertar CODE, HTML o PHP:
PDO:
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

$stmt->execute(array('name' => $name));

foreach ($stmt as $row) {
    // do something with $row
}

Insertar CODE, HTML o PHP:
MYSQLi:
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);

$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // do something with $row
}

Aquí puedes aprender cómo prevenir ataques XSS y CSRF:
https://manuais.iessanclemente.net/index.php/Evitar_ataques_XSS_y_CSRF_con_PHP
 
Es mejor que uses un cms ya que es mas dificil atacarlo, pero igual depende del hosting que estés contratando ya que también te pueden hacer ataques DoS.
 
Es mejor que uses un cms ya que es mas dificil atacarlo, pero igual depende del hosting que estés contratando ya que también te pueden hacer ataques DoS.

Supongo que ya analizó los CMS y por eso tomó la decisión de hacerse uno el mismo, y hasta donde se ningún hosting es anti-DoS.

Saludos colega!
 
Supongo que ya analizó los CMS y por eso tomó la decisión de hacerse uno el mismo, y hasta donde se ningún hosting es anti-DoS.

Saludos colega!

Bueno conozco hosting rusos y australianos que tienen sistemas para combatir con los ataques DoS, obviamente también depende mucho de la potencia del ataque, pero también estos hosting son un poco mas caros de los hosting comunes.
 
Para protegerte de ataques de inyección SQL debes de usar PDO o MYSQLi.

Ejemplo:
Insertar CODE, HTML o PHP:
PDO:
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

$stmt->execute(array('name' => $name));

foreach ($stmt as $row) {
    // do something with $row
}

Insertar CODE, HTML o PHP:
MYSQLi:
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);

$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // do something with $row
}

Aquí puedes aprender cómo prevenir ataques XSS y CSRF:
https://manuais.iessanclemente.net/index.php/Evitar_ataques_XSS_y_CSRF_con_PHP

Muchas gracias por los datos! Con esto ya no podrían atacarme ni obtener nada de la base de datos verdad? Les sería imposible?

Es mejor que uses un cms ya que es mas dificil atacarlo, pero igual depende del hosting que estés contratando ya que también te pueden hacer ataques DoS.

Ya probe varios CMS, ninguno se amolda a lo que necesito por eso decidí hacerme el mío.
 
Muchas gracias por los datos! Con esto ya no podrían atacarme ni obtener nada de la base de datos verdad? Les sería imposible?



Ya probe varios CMS, ninguno se amolda a lo que necesito por eso decidí hacerme el mío.

Con eso quedas protegido.

Recuerda, nunca confíes en tus usuarios 😛
 
Con eso quedas protegido.

Recuerda, nunca confíes en tus usuarios 😛

No voy a implementar registros para reducir el riesgo, simplemente son formularios para el pedido de productos y eso.
 
Para las basicas aqui tienes las funciones que se encargan de filtrar los datos, basicamente hay que colocarlas en cualquier entrada de datos del usuario (Todas las peticiones GET y POST) que afecte a la base de datos con mysqli_real_escape_string, para cualquier salida de datos se usa htmlentities para evitar ataques XSS, en subidas de archivos tambien es importante filtrar el nombre para evitar un IFXSS persistente.

Aqui tienes algo de informacion:
-SQLi:
PHP: mysql_real_escape_string - Manual
https://www.owasp.org/index.php/SQL_Injection
-XSS & IFXSS:
PHP: htmlentities - Manual
https://www.owasp.org/index.php/XSS
Image Filename XSS - IFXSS - Snifer@L4b's

Para ataques CSRF la idea es crear un token de sesion, que sera enviado en todas las peticiones (Por ejemplo imprimiendolos en los enlaces propios como parametros GET) para luego comprobarlo y generar uno nuevo, aqui tienes mas informacion detallada.

https://manuais.iessanclemente.net/index.php/Evitar_ataques_XSS_y_CSRF_con_PHP
https://www.owasp.org/index.php/CSRF

Por ultimo, para ataques LFI y RFI debes tener especial atencion al tratamiento de rutas, evitar incluir o manejar datos remotos o locales de una manera dinamica en medida de lo posible, de no ser posible puedes tratarlos de manera segura asignandoles las rutas a variables para despues comprobarlas usando algun condicional.

Esto es un mini resumen muy basico de los vectores de ataque web mas habituales, si quieres documentarte mejor puedes encontrar todo en https://www.owasp.org/, espero que te sea de ayuda. :encouragement:

//Regards.
 
Hola, echa un ojo a los objetos PDO y úsalos en lugar de las funciones mysql_.
 
Buenas, lo que te están diciendo (salvo sc0rpio) es incompleto.
Los principales ataques de los que te debes proteger son SQLi y XSS, para eso en el archivo con el que te conectas a la base de datos o en un archivo que incluyas en toda tu web puedes añadir esta función:
PHP:
function cleanString($input){
	global $mysqli;
	$cleanstring = $mysqli->real_escape_string(htmlspecialchars($input, ENT_QUOTES));
	return $cleanstring;
}

Y luego, todos los datos que introduzcan los usuarios y/o puedan modificar ($_GET, $_COOKIE, $_POST, $_REQUEST, $_FILE y variables del tipo $_SERVER['HTTP_CLIENT_IP']) los debes pasar por esta función. Por ejemplo:
PHP:
$descripcionproducto = cleanString($_GET['descripcion']);

Para variables que solo van a contener numeros enteros (1, 2, 3, 4...) basta con que pongas delante (int):
PHP:
$id_producto = (int)$_GET['idproducto']; //SI SE INTENTA INTRODUCIR ALGUN QUE NO SEA NUMERICO SE TRANSFORMARÁ EN 0

Después, para LFIy RFI simplemente no permitas que el usuario introduzca datos sobre que archivo incluir, por ejemplo:
http://tuweb.com/producto.php?file=edit.php
PHP:
include($_GET['file']);
Eso NUNCA.

Lo mejor es que lo indiques tu manualmente, o en caso de que necesites que lo introduzca el usuario limitar tu las opciones disponibles:
PHP:
if($_GET['file'] == 'edit'){
include('edit.php');
}elseifif($_GET['file'] == 'add'){
include('add.php');
}else{
die('No se ha encontrado el archivo');
}


Después para CSRF lo único es validar que siempre que se envié un formulario o una petición lo envíe una persona autorizada.
Por ejemplo en un formulario en la admin:
form.php:
PHP:
<?php 
if($_SESSION['admin']){
?>
<form>
FORMULARIO
</form>
<?php
}

procesarform.php:
PHP:
<?php
if(!empty($_POST['blabla']){
//PROCESAR FORMULARIO
}

Ese código sería vulnerable, tendrías que comprobar en el procesarform.php que es un admin el que está haciendo la petición:
PHP:
<?php
if(!empty($_POST['blabla'] && $_SESSION['admin']){
//PROCESAR FORMULARIO
}

Debes tener cuidado con eso sobre todo en formularios de cambiar contraseña, formularios de administración, editar perfil etc. que es donde es mas común.

Y eso es lo básico que debes saber para proteger tu código.

Después puede haber mas vulnerabilidades a nivel de servidor en sistemas desactualizados o con 0days pero de eso si tienes un buen host o un buen manager de servidor ellos se encargarán de mantener todo actualizado.

Saludos
 
No es mas fácil pasar los datos primero por "addslashes" en php para evitar las inyecciones?
 
Atrás
Arriba