Animalada en PHP

41 views
Skip to first unread message

Pablo Z - Medaneros

unread,
Dec 10, 2012, 9:21:27 AM12/10/12
to php...@googlegroups.com
Amigos

Qué tengo que ponerle a este código para que sea seguro? (me olvidé el nombre de las rutinas que escapan los caracteres...)
<?php require_once( 'basedatos.php' ); ?>
<?php
$dato=$_GET["dato"];

$sql = "update tabla set campo='".$dato."' ;
$result=mysql_query($sql);
Para que no me manden código como por ejemplo http://localhost/test.php&dato=hola; drop table tabla

Saludos
Z

DEH

unread,
Dec 10, 2012, 9:32:51 AM12/10/12
to php...@googlegroups.com
Hola,

La función de PHP para escapar en mysql es mysql_real_escape_string.
También es conveniente que uses un ORM, como por ejemplo propel,  http://propelorm.org/, te va a ayudar a tener una mejor abstracción de la DB.

Firma: yo

Agustin Quiroga

unread,
Dec 10, 2012, 9:35:46 AM12/10/12
to php...@googlegroups.com
Pablo,
Apoyo lo que dicen de un ORM, pero no se si vale la pena, dependiendo de cuan complejo sea lo tuyo imlementar un ORM, si solo es una instruccion de sql como comentas, te recomiendo usar PDO para ejecutar un statment y evitarte la inyeccion de codigo. 
Otra medida adicional sería que la fuente de request se autentique de alguna manera, validando la IP que origina el request por ejemplo.
Luego, pero ya más complejo, podrías comprobar que un solo tipo no te pinche la DB logueando cada actualizacion y poniendo un limite a estas por IP por día, o por hora.
Esto sería lo mínimo que se me ocurre.


Agustín Quiroga
Web.Q
Web. www.webq.com.ar
Twitter. @AgusQuiroga
Tel: +54.11.5368.7921 - Dir: Arenales 2838, 8° A.
Ciudad Autónoma de Buenos Aires, Argentina.
"Asesoramiento, desarrollo y soporte para proyectos y negocios en internet."



2012/12/10 DEH <deh...@gmail.com>
--
Has recibido este mensaje porque estás suscrito al grupo "Grupo PHP Argentina" de Grupos de Google.
Para ver este debate en la Web, visita https://groups.google.com/d/msg/php-arg/-/Y0KjiS8Yb04J.

Para publicar una entrada en este grupo, envía un correo electrónico a php...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a php-arg+u...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/php-arg?hl=es.

Adrian Ramiro

unread,
Dec 10, 2012, 10:15:53 AM12/10/12
to php...@googlegroups.com
Creo que nunca está de más sanitizar los datos recibidos.
Por ejemplo, si esperás un número entero:
$dato = inval($dato);  

o con type casting

$dato = (int) $dato;

Y con eso filtrás rapidamente cualquier intento de jugar con tu BD


2012/12/10 Agustin Quiroga <agusq...@webq.com.ar>



--
/**
* @author: Adrian R. Gay Cattaneo
*/

Tordek

unread,
Dec 10, 2012, 1:50:32 PM12/10/12
to php...@googlegroups.com
On 10/12/12 11:32, DEH wrote:
> Hola,
>
> La funci�n de PHP para escapar en mysql es mysql_real_escape_string.

1) No uses mysql. Us� mysqli. Tiene muchas cosas mejores (por algo
se llama Improved), incluyendo Prepared Statements y Transacciones.

2) No uses mysqli. Us� PDO. Es lo mismo que usar mysqli, pero con
una capa extra de abstracci�n.

Al no usar mysql, us�s los prepared statements de mysqli:

$query = mysqli_prepare($conexion, "update tabla set campo=?");
mysqli_bind_param($query, "s", $dato);
mysqli_execute($query);



$conexion->prepare("update tabla set campo=?");
$query->bind_param("s", $dato);
$query->execute($query);

o en PDO

$query = $conexion->prepare("update tabla set campo=?");
$query->execute(array($dato));

(Por supuesto, las llamadas particulares dependen de exactamente qu�
hagas; pero PDO tiende a ser m�s corto que mysqli.)

Y estas son las opciones r�pidas; tambi�n ten�s la posibilidad de
bindear par�metros por nombre ("update tabla set campo=:campo"),
para ser expl�cito, y aclarar el tipo del par�metro (en el caso de
mysqli est� puesto con "s"; en el caso de PDO ten�s que usar
bindParam o bindValue).

"No, pero..."

No, pero nada. Es infinitamente m�s seguro usar PS que
mysql_escape_real_string (acordate del _real_ porque si no us�s la
versi�n vieja, que es insegura). Adem�s, tu query no queda como un
rejunte de strings, sino como una query con espacios para
par�metros, que se los pas�s m�s abajo.

Los PS son m�s seguros (si la DB los soporta, por supuesto; sqlite,
no) porque gener�s una query y se la das a mysql que la parsee.
Despu�s le pas�s los par�metros. Es imposible modificar la forma de
la query porque ya est� parseada.

> Tambi�n es conveniente que uses un ORM, como por ejemplo propel,
> http://propelorm.org/, te va a ayudar a tener una mejor abstracci�n
> de la DB.

�Conviene? �Qu� est�s haciendo? Obviamente, puso un ejemplo trivial
para hacer una pregunta, y es f�cil decir "para ese ejemplo no vale
la pena". �Cuantas entidades tiene tu sistema? �Cuantas preve�s? Si
ten�s menos de 5*, probablemente no rinda. Si ten�s m�s que eso,
probablemente s�.

>
> Firma: yo

*N�mero obtenido de una galera.
--
Guillermo O. �Tordek� Freschi. Programador, Escritor, Genio Maligno.
http://tordek.com.ar :: http://twitter.com/tordek

Agustin Quiroga

unread,
Dec 12, 2012, 8:52:57 AM12/12/12
to php...@googlegroups.com
Un único comentario, es preferible usar "bindParam" ya que podes declarar explicitamente el tipo de parámetro y el PDO lo maneja según eso (evitando problemas), si no entiendo mal al pasar por array los parámetros al método execute los usa en el tipo de variable de PHP, con lo cual si levantas del query string una cadena y no un numero pasa derecho, evita la inyección, pero pasa. (esto ultimo es en base a experiencia mia, nunca lo vi en la documentación mencionado, si alguno puede aportar más datos, gracias). 


Agustín Quiroga
Web.Q
Web. www.webq.com.ar
Twitter. @AgusQuiroga
Tel: +54.11.5368.7921 - Dir: Arenales 2838, 8° A.
Ciudad Autónoma de Buenos Aires, Argentina.
"Asesoramiento, desarrollo y soporte para proyectos y negocios en internet."



2012/12/10 Tordek <ked...@gmail.com>
¿Conviene? ¿Qué estás haciendo? Obviamente, puso un ejemplo trivial para hacer una pregunta, y es fácil decir "para ese ejemplo no vale la pena". ¿Cuantas entidades tiene tu sistema? ¿Cuantas preveés? Si tenés menos de 5*, probablemente no rinda. Si tenés más que eso, probablemente sí.

Pablo Z - Medaneros

unread,
Dec 12, 2012, 8:54:26 AM12/12/12
to php...@googlegroups.com
ya mismo lo pruebo! gracias!


El 10/12/2012 03:50 p.m., Tordek escribi�:

Pablo Rebolini

unread,
Jan 6, 2013, 11:07:59 AM1/6/13
to php...@googlegroups.com
Concuerdo con Agustin, intenta con PDO, te dejo dos buenos tutoriales:


El miércoles, 12 de diciembre de 2012 10:54:26 UTC-3, medaneros escribió:
ya mismo lo pruebo! gracias!


El 10/12/2012 03:50 p.m., Tordek escribi�:
> On 10/12/12 11:32, DEH wrote:
>> Hola,
>>
>> La funci�n de PHP para escapar en mysql es mysql_real_escape_string.
>
> 1) No uses mysql. Us� mysqli. Tiene muchas cosas mejores (por algo se
> llama Improved), incluyendo Prepared Statements y Transacciones.
>
> 2) No uses mysqli. Us� PDO. Es lo mismo que usar mysqli, pero con una
> capa extra de abstracci�n.
>
> Al no usar mysql, us�s los prepared statements de mysqli:
>
> $query = mysqli_prepare($conexion, "update tabla set campo=?");
> mysqli_bind_param($query, "s", $dato);
> mysqli_execute($query);
>
> �
>
> $conexion->prepare("update tabla set campo=?");
> $query->bind_param("s", $dato);
> $query->execute($query);
>
> o en PDO
>
> $query = $conexion->prepare("update tabla set campo=?");
> $query->execute(array($dato));
>
> (Por supuesto, las llamadas particulares dependen de exactamente qu�
> hagas; pero PDO tiende a ser m�s corto que mysqli.)
>
> Y estas son las opciones r�pidas; tambi�n ten�s la posibilidad de
> bindear par�metros por nombre ("update tabla set campo=:campo"), para
> ser expl�cito, y aclarar el tipo del par�metro (en el caso de mysqli
> est� puesto con "s"; en el caso de PDO ten�s que usar bindParam o
> bindValue).
>
> "No, pero..."
>
> No, pero nada. Es infinitamente m�s seguro usar PS que
> mysql_escape_real_string (acordate del _real_ porque si no us�s la
> versi�n vieja, que es insegura). Adem�s, tu query no queda como un
> rejunte de strings, sino como una query con espacios para par�metros,
> que se los pas�s m�s abajo.
>
> Los PS son m�s seguros (si la DB los soporta, por supuesto; sqlite,
> no) porque gener�s una query y se la das a mysql que la parsee.
> Despu�s le pas�s los par�metros. Es imposible modificar la forma de la
> query porque ya est� parseada.
>
>> Tambi�n es conveniente que uses un ORM, como por ejemplo propel,
>> http://propelorm.org/, te va a ayudar a tener una mejor abstracci�n
>> de la DB.
>
> �Conviene? �Qu� est�s haciendo? Obviamente, puso un ejemplo trivial
> para hacer una pregunta, y es f�cil decir "para ese ejemplo no vale la
> pena". �Cuantas entidades tiene tu sistema? �Cuantas preve�s? Si ten�s
> menos de 5*, probablemente no rinda. Si ten�s m�s que eso,
> probablemente s�.
>
>>
>> Firma: yo
>
> *N�mero obtenido de una galera.

Reply all
Reply to author
Forward
0 new messages