2010-02-22 28 views
12

Estoy en problemas con un grupo de hackers. se cortaron sitio varias veces de mi cliente, y mi cliente se vuelve más enojado :(mi cliente perdió su base de datos (que tiene cientos de registros), y tenía que introducir toda :(¿Dónde usar mysql_real_escape_string para evitar la inyección SQL?

ahora estoy siguiendo algunas introducciones más;

  • permisos de archivos fijos
  • cambiada ftp y acceso al sitio de acogida información
  • borrarán todos los accesos MySQL remota

ahora a trabajar en cuestión de inyección SQL. añadí mysql_real_escape_ cadena a los parámetros de inicio de sesión del panel de administración. Entonces, ¿dónde más debería usar esta mysql_real_escape_string? Tengo pocos formularios de correo electrónico en el sitio, no creo que deba agregarlo ...

Tengo un index.php como página principal. ¿Debo hacer algo por esta página para evitar cualquier ataque de inyección sql a través de la url como index.php?somesql=?

Por favor, ¡avísenme! ¡¡¡Aprecio mucho !!! :(


por ejemplo:.

tengo dicho código;

public function showDetails($id) { 

    // SQL Jobs Details 
    $this->sql_job = "SELECT * FROM jobs WHERE id=".mysql_real_escape_string($id); 
    $this->rst_job = mysql_query($this->sql_job);   
    $this->row_all = mysql_fetch_assoc($this->rst_job);  

    // SQL State 
    $this->sql_state = "SELECT title FROM state WHERE id=" . $this->row_all[$this->tbl_jobs['f4']]; 
    $this->rst_state = mysql_query($this->sql_state); 
    $this->row_state = mysql_fetch_assoc($this->rst_state); 
........ 

es lo suficiente como para utilizar mysql_real_escape_string de $ id no por $ this-> row_all [$ this-> tbl_jobs ['f4']]

+2

Soy un tipo de MSSQL así que espero que esto se aplique, ¿por qué un inicio de sesión en un sitio web tiene permiso para eliminar algo? En cuanto a perder una base de datos, ¿dónde están las copias de seguridad? –

+1

"SELECCIONAR * FROM trabajos DONDE id =". Mysql_real_escape_string ($ id) es vulnerable a la inyección sql. $ id = "1 o sleep (50)" – rook

+0

+1 a la torre. mysql_real_escape_string no es una bala mágica, solo es una función de escape de cadenas y solo funciona cuando se usa dentro de comillas. – Cheekysoft

Respuesta

13

Básicamente, cada vez que utiliza algunos datos inseguros (entrada de usuario, valor de una base de datos, un archivo o un sitio web externo, es decir, cualquier dato que no sea 100% seguro de que es seguro) en una consulta SQL, debe escapar utilizando mysql_real_escape_string. Tenga en cuenta que according to OWASP, esta función no es segura para escapar de nombres de tablas dinámicas (pero esto es mucho menos común que la inserción de entradas de usuario "básicas").

Le sugiero que eche un vistazo al total OWASP article on SQL injection, y también para explorar el resto del sitio web. Es una gran fuente de información sobre seguridad en aplicaciones web.

IMO, la forma preferida de evitar la inyección de SQL es usar prepared statements.

Recuerde que si elige usar mysql_real_escape_string(), solo funciona cuando se usa dentro de una cadena delimitada por comillas. Nunca lo use en el ningún valor sin incluir. Esto incluye valores numéricos; en su lugar, valide que la entrada del usuario es en realidad numérica.

+0

No solo la entrada del usuario per se. Cualquier dato que use como parámetro no puede estar absolutamente seguro (para toda la eternidad) de que no contendrá los caracteres que tiene que escapar. P.ej. si (por algún motivo) extraes datos de la base de datos y los utilizas en otra consulta, sin interacción del usuario pero aún así tienes que escapar de los datos. O use declaraciones preparadas. – VolkerK

+0

Tienes razón, actualizaré mi respuesta con tus precisiones. ¡Gracias! – Wookai

3

Una de las reglas de oro del desarrollo web NUNCA (¡SIEMPRE!) Es que el usuario confíe. Por lo tanto, en cualquier lugar donde tenga datos ingresados ​​en la base de datos, debe llamar a mysql_real_escape_string().

Además, para evitar clientes enojados en el futuro, debe hacer una copia de seguridad de su base de datos regularmente. Si yo fuera tu cliente, estaría furioso ahora mismo.

Buena suerte en asegurar su sitio.

+0

gracias por la respuesta. ¿Qué pasa con los datos de llamadas desde db? ¿Usaremos mysql_real_escape_string() en ese caso también? o jsut para variables en sql ir a la base de datos? –

3

La mejor manera de evitar la inyección de SQL es mediante el uso de declaraciones preparadas y variables de vinculación.¿Qué versión de MySQL estás usando? Las declaraciones preparadas están disponibles en 4.1 y superior.

3

Los dos principales cosas que hacer con la entrada del usuario son

  1. filtrado de entrada
  2. el mecanismo de escape

filtrado de entrada es el proceso de transformación de los datos/[antes]/se almacena en la base de datos. La ejecución de mysql_real_escape_string() se incluye en este paso (aunque hay mejores formas de desinfectar los datos de usuario para la inserción de db), pero este paso también puede incluir recorte de espacio en blanco, filtrado de blasfemia, conversión de marcado y más.

Salida Escaping se está ocupando al enviar contenido del usuario al navegador que no permite el comportamiento malicioso. Esto significa ejecutar htmlentities() o algún otro proceso selectivo de selección.

Hay otras cosas que puede hacer, como la limitación de recursos (prevención de DOS), tokens de formulario (protección CSRF), etc. Vaya a OWASP y comience a leer.

Cuestiones relacionadas