2012-01-06 20 views
5

Estoy creando un sitio web donde los usuarios pueden almacenar fragmentos de código, utilizando PHP y una base de datos mySQL. Pero no puedo encontrar la forma de insertar de manera segura el código de usuario en mi base de datos. No puedo transformar la entrada con las funciones de 'seguridad' que normalmente uso (trim, stripslashes, etc.) porque todo el asunto es que puede ver el código tal como se encuentra en la base de datos. Miré my_real_escape_string() pero vi que no escapa a % y _, que se pueden usar como comodines MySQL. ¿Eso representa una amenaza, o puedo simplemente usar my_real_escape_string? Gracias por adelantado.Cómo insertar código de forma segura en la base de datos mySQL

+0

['addcslashes'] (http://php.net/addcslashes) se usa comúnmente además del escape normal o enlace de parámetros para enmascarar marcadores de posición para expresiones' LIKE'. – mario

+0

trim/stripslashes NO son funciones de seguridad. El espacio adicional nunca es una preocupación en sql, a menos que esté preocupado por perder datos en un campo de texto/cadena de longitud fija. stripslashes es un pedazo de basura cerebral muerto desde los primeros días de PHP cuando magic_quotes era el rey de la tierra. –

+0

anterior StackOverFlow Preguntas que podrían responder a su pregunta: http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php http://stackoverflow.com/questions/4461759/parameterized -queries –

Respuesta

6

Los comodines solo tienen efecto cuando se usan en consultas SELECT y solo cuando se usan ciertas funciones. Entonces, para insertar el código, estará bien usar mysql_real_escape_string() ya que no tendrán ningún efecto.

Para hacerlo mejor, le recomendaría que use PHPs PDO para que pueda usar el enlace de parámetros. El siguiente ejemplo es de the PHP manual:

<?php 
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); 
$stmt->bindParam(':name', $name); 
$stmt->bindParam(':value', $value); 

// insert one row 
$name = 'one'; 
$value = 1; 
$stmt->execute(); 

// insert another row with different values 
$name = 'two'; 
$value = 2; 
$stmt->execute(); 
?> 
1

Utilice una instrucción de inserción parametrizada. En realidad, use parametrizado incluso para sus selecciones y actualizaciones.

manejará automáticamente estas cosas por usted.

+1

¿por qué el voto hacia abajo? –

+2

No es mi voto negativo, pero podría decirse que no es realmente una respuesta a la pregunta del OP. Además, no estás explicando qué biblioteca usar –

0

Uso de PDO:

$dsn = 'mysql:dbname=testdb;host=127.0.0.1'; 
$user = 'dbuser'; 
$password = 'dbpass'; 

try { 
    $dbh = new PDO($dsn, $user, $password); 
} catch (PDOException $e) { 
    echo 'Connection failed: ' . $e->getMessage(); 
} 

$calories = 150; 
$colour = 'red'; 
$sth = $dbh->prepare('INSERT INTO fruit(name, colour, calories) VALUES(?, ?);'); 
$sth->execute(Array($calories, $colour)); 
4

Usando mysql_real_escape_string() proporciona una protección completa para los valores de cadena. El hecho de que pueda haber % y _ en los datos no es relevante, no representa una amenaza para la seguridad.

Para valores int, es necesario validar si bien en realidad son números, o envolverlos en comillas:

$intValue = mysql_real_escape_string($_POST["intValue"]); 
$query = mysql_query("INSERT INTO table SET intValue ='$intValue'"); 
                 // note the quotes 

Sin las comillas, mysql_real_escape_string() es inútil en valores numéricos!

Sin embargo, como ya dijo @Daniel A. White, si recién está comenzando, considere usar el PDO library. Es más nuevo que las antiguas funciones mySQL y ofrece consultas parametrizadas que, si se usan correctamente, hacen imposible la inyección de SQL.

0

Esto es lo que funcionó para mí, [adscript] es un fragmento de código.

<textarea rows="6" cols="80"><input name="adscript" type="text/javascript" class="text-input textarea" id="adscript" value="<?php echo htmlentities($row['adscript']);?>" size="80" height="40" maxlength="1000"></textarea> 
Cuestiones relacionadas