¿Protegerme ante posibles ataques de SQLi?

Iniciado por z3nth10n, 9 Septiembre 2014, 14:38 PM

0 Miembros y 1 Visitante están viendo este tema.

z3nth10n

Hola buenas, pues he decido hacer una API para un servicio un tanto especial, tan especial que no me deja manejar ni MySQL ni PHP, por tanto tengo que mandar todas las peticiones a mi página usando JS...

Entonces, ahora mismo lo hago de la siguiente manera:

File.js
====

Código (javascript) [Seleccionar]
var key = "md5 string";

function sendToDB(data) {
accedo al php con un post => sendpost("file.php?key=key&domain="+location.hostname+"&data=data");
}


File.php
=====

Código (PHP) [Seleccionar]
$domain = @$_GET['domain'];
$credentials = mysqli_fetch_array(mysqli_query("SELECT * FROM clientes WHERE domain = $domain", $conn));

if($key == $credentials['key']) {
//Allow access and send data...
$data = @$_GET['data'];
mysqli_query("ENVIAR INFO A LA DB");
}


Entonces eso va genial para las injections ya que si paso la "data" tal como viene, pues apaga y vámonos...

Y como no lo puedo hacer de otra manera, lo único que se me ha ocurrido es enviar la información ("data") de forma cifrada o bien en Base64 o serializando...

No se os ocurre nada más seguro que eso? Quizás por la parte de PHP me puedo proteger más y a parte de usar un mysqli_real_escape_string no se me ocurre nada más... Qué me recomendáis?

Un saludo.

Interesados hablad por Discord.

#!drvy

Usas mysqli_ como si fuese mysql_.  Tienes sentencias preparadas..

http://php.net/manual/es/mysqli.quickstart.prepared-statements.php

Cifrar no te va a servir de nada, tienes que proteger el receptor (file.php) no el emisor(file.js).

Saludos

engel lex

#2
si es algo que requiere seguridad puedes hacer lo siguiente por seguridad a costo de memoria y tiempo de procesamiento (si no tienes 100 peticiones simultaneas no hay problema por lo menos a mi en una tabla con 720 valores me tarda "0.0020 segundos" la búsqueda)

Código (php) [Seleccionar]
$domain = @$_GET['domain'];
$md5_domain = md5($domain);
$credentials = mysqli_fetch_array(mysqli_query("SELECT * FROM clientes WHERE MD5(domain) = $md5_domain", $conn));


y si quieres agilizar el proceso solo guardas la tabla con los valores listos en MD5 y le quitas al mysql el peso de convertirlos...

el asúnto es que allí ya no hay ataque que pase ya que cualquier cosa rara fue destruida y reducida a un md5...

por cierto, cuidado con ese fetch_array directo sin comprobar si hubo resultado o no, porque va a tirar un error...
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Graphixx

A mi se me ocurre que en el php puedes saber cuando es data oficial, filtrando la peticion por HTTP_REFERER.
Código (php) [Seleccionar]

<?php
$url
=$_SERVER['HTTP_REFERER'];
echo 
'<strong>'."viene de(ruta completa): ".'</strong>'.$_SERVER['HTTP_REFERER'].'<br />';

preg_match'@^(?:http://)?([^/]+)@i'$_SERVER['HTTP_REFERER'], $matches );
$host $matches[1]; 

echo 
'<strong>'."viene de(dominio): ".'</strong>'.$host;
?>


Es solo una idea, no se que tan falsificable sea el HTTP_REFERER.
Nada tiene fin solo hay pequeñas pausas, pausas que determinan el comienzo de otros. Graphixx
Mi blog

engel lex

Cita de: Graphixx en 10 Septiembre 2014, 02:05 AM
A mi se me ocurre que en el php puedes saber cuando es data oficial, filtrando la peticion por HTTP_REFERER.

Es solo una idea, no se que tan falsificable sea el HTTP_REFERER.
falsificable? XD si! lo es y mucho... pero el asunto aquí no es el enlazamiento externo... es que sea victima de un ataque de inyección
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.