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
Respuesta
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();
?>
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.
¿por qué el voto hacia abajo? –
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 –
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));
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.
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>
- 1. Cómo insertar DECIMAL en la base de datos MySQL
- 2. ¿Cómo insertar un archivo en la base de datos MySQL?
- 3. ¿Cómo puedo mantener segura una base de datos mySQL?
- 4. ¿Puedo eliminar de forma segura los archivos .BAK de la base de datos mysql?
- 5. Cómo insertar los datos del formulario en la tabla de base de datos MySQL
- 6. Concurrencia segura de la base de datos en ROR
- 7. ¿Cómo insertar un mensaje de correo electrónico entrante en la base de datos mySQL?
- 8. Cómo copiar una tabla de una base de datos mysql a otra base de datos mysql
- 9. Diseño de base de datos cifrada segura
- 10. El uso de shell script para insertar datos en la base de datos MySQL remota
- 11. Código para insertar datos en la base de datos de SQL Server usando la biblioteca Enterprise
- 12. Error al tirar de la base de datos mysql en la base de datos mysql local
- 13. Insertar datos en la base de datos Oracle utilizando php
- 14. crear base de datos segura en mongodb
- 15. ¿Cómo cierro el Cursor y la Base de Datos de forma segura?
- 16. Cómo almacenar datos de manera segura en MySQL usando AES_ENCRYPT
- 17. ¿Cómo obtengo el "id" después de INSERTAR en la base de datos MySQL con Python?
- 18. LINQ Consulta para insertar datos en la base de datos
- 19. Insertar datos en la tabla de MySQL con Java
- 20. importación de base de datos MySQL
- 21. Cómo cifrar de forma segura la información de la tarjeta de crédito en una base de datos
- 22. INSERTAR en la cadena DateTime de la base de datos
- 23. ¿Cómo insertar caracteres arábigos en la base de datos sql?
- 24. ¿Cómo insertar null en la base de datos?
- 25. ¿Cómo volcar la base de datos mysql?
- 26. ¿Cómo insertar caracteres especiales en una base de datos?
- 27. Insertar fecha/hora en la base de datos de Access
- 28. ¿Cómo insertar múltiples filas en una base de datos mysql a la vez con declaraciones preparadas?
- 29. Insertar datos binarios en MySQL (sin PreparedStatement)
- 30. Inserción segura de datos en la base de datos SQLite con el apóstrofo
['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
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. –
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 –