2011-07-28 57 views
11

Tring para hacer mi PHP lo más segura posible, y las dos cosas principales que estoy tratando de evitar sonfunción A PHP para evitar que las inyecciones SQL y XSS

  • mySQL inyecciones Scripting
  • Cruz-Side (XSS)

Este es el script que tengo con mySQL Inyecciones:

function make_safe($variable) { 
$variable = mysql_real_escape_string(trim($variable)); 
return $variable; } 

http://www.addedbytes.com/writing-secure-php/writing-secure-php-1/


contra XSS, encontré esto:

$username = strip_tags($_POST['username']); 

Ahora quiero unir los dos en una sola función. ¿Esta sería la mejor manera de hacerlo? :

function make_safe($variable) { 
$variable = strip_tags(mysql_real_escape_string(trim($variable))); 
return $variable; } 

O el mysql_real_escape_string ya evitar XSS? Y, por último, ¿hay algo más que pueda agregar a esta función para evitar otras formas de piratería?

+3

No hay varita mágica, solo vigilancia constante. –

+3

¡Usted y [PDO] (http://php.net/manual/en/book.pdo.php) deberían hacerse amigos! – Jacob

+0

Realmente no entiendo lo que ustedes dos dicen;) – LonelyWebCrawler

Respuesta

11

mysql_real_escape_string() no impide XSS. Solo hará imposible hacer inyecciones de SQL.

Para luchar contra XSS, necesita utilizar htmlspecialchars() o strip_tags(). Primero, convertirá los caracteres especiales como < en &lt; que aparecerán como <, pero no se ejecutarán. 2nd acaba de quitar todas las etiquetas.

No recomiendo hacer una función especial para hacerlo o incluso hacer una función para hacerlo todo, pero su ejemplo dado funcionaría. Asumo.

+0

¿Por qué no una función? – LonelyWebCrawler

+0

¿Y no puedo usar strip_tags(), por lo que htmlspecialchars() es redundante? – LonelyWebCrawler

+0

pregunta n. ° 1: nada sirve para todos. Pregunta # 2 - eso es correcto. – daGrevis

13

Esta función:

function make_safe($variable) 
{ 
    $variable = strip_tags(mysql_real_escape_string(trim($variable))); 
    return $variable; 
} 

no funcionará

de inyección SQL y XSS son dos animales diferentes. Debido a que cada uno requiere un escape diferente, debe usar cada función de escape strip_tags y mysql_real_escape_string por separado.
Unirlos derrotará la seguridad de cada uno.

Utilice el estándar mysql_real_escape_string() al ingresar datos en la base de datos.
Use strip_tags() al consultar cosas fuera de la base de datos antes de enviarlas a la pantalla.

Por qué la combinación de las dos funciones es peligroso
De los caballos boca: http://php.net/manual/en/function.strip-tags.php

Debido strip_tags() en realidad no validar el código HTML, las etiquetas parciales o roto puede dar lugar a la eliminación de más texto/datos de lo esperado.

Así que mediante la introducción de HTML incorrecto en un campo de la base de datos a un atacante inteligente puede usar su aplicación ingenua de derrotar mysql_real_escape_string() en su combinado.

+0

Entonces, ¿uso mysql_real_escape_string() cuando agrego datos a la base de datos, pero no cuando comparo la entrada del usuario con las entradas de la base de datos (como al iniciar sesión)? – LonelyWebCrawler

+0

@user, utiliza 'mysql_real_escape_string()' ** always **, en cada consulta, ya sea seleccionar, actualizar eliminar o insertar. – Johan

2

Lo que realmente debería estar buscando es usar prepared statements y PDO para proporcionar una capa de abstracción en su base de datos y erradicar por completo los ataques de inyección SQL.

En cuanto a XSS, asegúrese de no confiar nunca en la información del usuario. Ejecute strip_tags o htmlentities cuando almacene los datos, o cuando los muestre (no ambos ya que esto interferirá con su resultado), y todo estará bien.

+0

Nunca he oído hablar de PDO. ¿Que es eso? – LonelyWebCrawler

+0

PDO es una capa de abstracción de base de datos incluida con PHP. Eche un vistazo aquí para una introducción: http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/ –

Cuestiones relacionadas