Escolar Documentos
Profissional Documentos
Cultura Documentos
PHP incorpora de serie envolturas para distintos protocolos tipo URL para trabajar junto con funciones
del sistema de ficheros, como fopen(), copy(),file_exists() y filesize(). Adems de estas envolturas,
se pueden definir por el usuario utilizando la funcin stream_wrapper_register().
Nota: La sintaxis de URL que se utiliza para describir una envoltura solo puede ser scheme://....
Las sintaxis scheme:/ y scheme: no estn soportadas.
file://
file:// Acceso al sistema de ficheros local
Report a bug
Descripcin
El Sistema de Ficheros es la envoltura por omisin de PHP y representa al sistema de ficheros local.
Cuando se proporciona una ruta relativa (esto es, no comienza con /, \, \\, ni con la letra de un
dispositivo Windows) sta se har usando el directorio de trabajo actual. En muchos casos, se trata
del directorio en el que se aloja el script, a no ser que se haya cambiado explicitamente. Si se utiliza
la sapi CLI, apuntar al directorio desde el que se ejecut el script.
En algunas funciones, como por ejemplo fopen() o file_get_contents(), puede usarse
tambin include_path para localizar ficheros con rutas relativas.
Report a bug
Opciones
/ruta/al/fichero.ext
ruta/relativa/al/fichero.ext
ficheroEnDta.ext
C:/ruta/a/ficherowindows.ext
C:\ruta\a\ficherowindows.ext
\\servidorsmb\ruta\compartida\a\ficherowindows.ext
file:///ruta/al/fichero.ext
Report a bug
Opciones
Resumen de la Envoltura
Atributo
Permitido
No
Permite Lecturas
Resumen de la Envoltura
Atributo
Permitido
Permite Escrituras
http://
https://
http:// -- https:// Acceso a URLS en HTTP(s)
Report a bug
Descripcin
Permite acceso de lectura a ficheros/recursos mediante HTTP 1.0, utilizando el mtodo GET de HTTP.
Junto con la peticin, se enva una cabecera Host:para as poder usar hosts virtuales basados en
nombres. Si se ha definido un user_agent en el fichero php.ini o en el contexto del flujo, ste se
incluir tambin en la peticin.
El flujo proporciona acceso al cuerpo del recurso; las cabeceras se guardan en la
variable $http_response_header.
Si fuera importante conocer la URL del recurso del que procede el documento (tras procesar todas las
redirecciones), se debern procesar todas las cabeceras de respuesta devueltas por el flujo.
Se usar la directiva from en la cabecera From: siempre que est asignado y no se sobrescriba
por Opciones de contexto y parmetros.
Report a bug
Opciones
http://ejemplo.com
http://ejemplo.com/fichero.php?var1=val1&var2=val2
http://usuario:contrasea@ejemplo.com
https://ejemplo.com
https://ejemplo.com/fichero.php?var1=val1&var2=val2
https://usuario:contrasea@ejemplo.com
Report a bug
Opciones
Resumen de la Envoltura
Atributo
Permitido
Permite Lecturas
Permite Escrituras
No
No
N/A
No
No
No
No
No
Report a bug
Historial de cambios
Versin
4.3.7
Descripcin
Detectado errores en servidores IIS para evitar "SSL: Fatal Protocol
Error".
Versin
Descripcin
4.3.0
Aadido https://.
4.0.5
Report a bug
Ejemplos
Ejemplo #1 Detectar la URL en la que se finaliza tras las redirecciones
<?php
$url = 'http://www.example.com/redirecting_page.php';
$fp = fopen($url, 'r');
$meta_data = stream_get_meta_data($fp);
foreach ($meta_data['wrapper_data'] as $response) {
/* Were we redirected? */
if (strtolower(substr($response, 0, 10)) == 'location: ') {
/* update $url with where we were redirected to */
$url = substr($response, 10);
}
}
?>
Notas
Nota: Slo habr soporte para HTTPS cuando la extensin openssl est habilitada.
Las conexiones HTTP son de slo lectura; no hay soporte para escribir o copiar datos a un recurso
HTTP.
Se pueden enviar peticiones POST y PUT, por ejemplo, con ayuda de los Contextos HTTP.
Report a bug
Ver tambin
Opciones de contexto de HTTP
$http_response_header
stream_get_meta_data() - Recuperar meta-informacin o de cabecera de punteros a
flujos/archivo
ftp://
ftps://
ftp:// -- ftps:// Acceso a URLs por FTP(s)
Report a bug
Descripcin
Permite tanto lectura de ficheros existentes como la creacin de nuevos ficheros va FTP. La conexin
fallar si el servidor no soporta FTP en modo pasivo.
Se puede tanto leer como escribir ficheros, pero no las dos cosas simultneamente. Si el fichero
remoto ya existiera en el servidor ftp, y se quisiera abrir en modo escritura sin especificar la opcin
de contexto overwrite, tambin fallar la conexin. Si fuera necesario sobrescribir un fichero ya
existente en ftp, se tendr que especificar la opcin de contexto overwrite antes de abrir el fichero
para su escritura. Alternativamente, puede usarse la extensin FTP.
Si se ha establecido la directiva from en php.ini, se enviar como contrasea para conexiones de FTP
annimo.
Report a bug
Opciones
ftp://ejemplo.com/pub/fichero.txt
ftp://usuario:contrasea@example.com/pub/fichero.txt
ftps://ejemplo.com/pub/fichero.txt
ftps://usuario:contrasea@ejemplo.com/pub/fichero.txt
Report a bug
Opciones
Resumen de la Envoltura
Atributos
PHP 4
PHP 5
Permite Lecturas
Permite Escrituras
S (slo en ficheros
nuevos)
No
No
No
No
No
No
No
No
Desde PHP 5.0.0: slo los elementos filesize(), filetype(), file_exists(), is_file(), y is_dir(). Desde PHP
5.1.0: filemtime().
Notas
Nota:
Hay soporte para FTPS desde PHP 4.3.0, siempre y cuando se haya compilado con soporte
para openssl.
Si el servidor no soporta SSL, entonces la conexin se restablece a una conexin ftp regular sin
encriptacin.
Nota: Aadiendo contenido
Desde PHP 5.0.0 se puede aadir contenido a los ficheros mediante la envoltura de URL ftp://. Si se
tratara de aadir contenido a un fichero conftp:// en versiones anteriores, se provocara un fallo.
php://
php:// Acceso a distintos flujos de E/S
Report a bug
Descripcin
PHP ofrece una serie de flujos de E/S generales que permite acceder tanto a los flujos de entrada y
salida de PHP, a la entrada estndar, a descriptores de ficheros de salida y de errores, a flujos de
ficheros temporales en memoria y en disco, y a filtros para poder manipular otros recursos de
ficheros segn se lee o se escribe en ellos.
php://stdin, php://stdout y php://stderr
php://stdin, php://stdout y php://stderr permiten acceder directamente al correspondiente flujo de
entrada o salida del proceso PHP. El flujo hace referencia a un descriptor de fichero duplicado, de
modo que si se abre php://stdin y ms tarde se cierra, slo se cerrara la copia del descriptor; el flujo
real al que referencia STDIN no se vera afectado. Tenga en cuenta que PHP mostraba un
comportamiento irregular en este aspcto hasta PHP 5.2.1. Se recomienda utilizar simplemente las
constantes STDIN, STDOUT y STDERR en lugar de abrir flujos manualmente usando estas envolturas.
php://stdin es de slo lectura, mientras que php://stdout y php://stderr son de slo escritura.
php://input
php://input es un flujo de slo lectura que permite leer datos del cuerpo solicitado. En el caso de
peticiones POST, es preferible usar php://input en vez de $HTTP_RAW_POST_DATA ya que no
depende de diretivas php.ini especiales. Sin embargo, cuando no se genera
automticamente$HTTP_RAW_POST_DATA, se trata de una alternativa que hace un uso menos
intensivo de memoria que activando always_populate_raw_post_data.php://input no est disponible
con enctype="multipart/form-data".
Nota: Los flujos que se abren con php://input slo pueden leerse una vez; no hay soporte para
operaciones de bsqueda. Pero, dependiendo de la SAPI, podra ser posible abrir otro
flujo php://input para reiniciar la lectura. Esto slo es posible si los datos de la peticin se han
guardado. Este caso es tpico en peticiones POST, pero no en otros mtodos de peticin, como por
ejemplo PUT o PROPFIND.
php://output
php://output es un flujo de slo lectura que permite escribir en el buffer de salida tal como lo
hacen print y echo.
php://fd
php://fd permite el acceso directo al descriptor de archivo dado. Por ejemplo, php://fd/3 refiere al
descriptor de archivo 3.
php://memory y php://temp
php://memory y php://temp son flujos de lectura-escritura que permiten almacenar datos
temporales en una envoltura similar a un fichero. La nica diferencia entre las dos es
que php://memory siempre almacenar sus datos en memoria, mientras que php://temp utilizar un
fichero temporal cuando la cantidad de datos almacenados superen el lmite predefinido (por omisin,
2 MB). La ubicacin de este fichero temporal est determinada de la misma manera que la
funcin sys_get_temp_dir(),
El lmite de memoria de php://temp se puede controlar aadiendo /maxmemory:NN, donde NN es
la cantidad en bytes mxima de datos a almacenar en memoria antes de recurrir a un fichero
temporal.
php://filter
php://filter es una especie de meta-envoltura diseada para permitir aplicar filtros a los flujos en las
aperturas. Esto es muy til en las funciones todo en uno, como readfile(), file(),
y file_get_contents() donde, por otra parte, no se pueden aplicar filtros a los flujos antes de que se
lea su contenido.
php://filter acepta los siguientes parmetros como parte de su ruta. Se pueden especifcar mltiples
filtros en una ruta. Por favor, consulte los ejemplos para los usos concretors de estos parmetros.
parmetros de php://filter
Nombre
Descripcin
resource=<flujo a filtrar>
read=<listra de filtros a aplicar a la Este parmetro es opcional. Se pueden enumerar uno o ms filtros, separados
cadena de lectura>
por el carcter |.
write=<lista de filtros a aplicar a la Este parmetro es opcional. Se puedene enumerar uno o ms filtros, separados
cadena de escritura>
por el carcter |.
<lista de filtros a aplicar a las dos
cadenas>
Cualquier listra de filtros que no est precedida ni por read= ni por write= se
aplicar tanto a las cadenas de lectura como de escritura segn proceda.
Report a bug
Opciones
Resumen de la Envoltura (Para php://filter, consltese el resumen de la envoltura que se filtra)
Atributo
Permitido
Restringido
por allow_url_fopen
No
Restringido
por allow_url_include
Permite Lecturas
Permite Escrituras
Permite Aadir
contenidos
Permitido
Permite Lecturas y
Escrituras Simultneas
Permite usar la
funcin stat()
Permite usar la
funcin unlink()
No
Permite usar la
funcin rename()
No
Permite usar la
funcin mkdir()
No
Permite usar la
funcin rmdir()
No
Permite usar la
funcinstream_select()
Report a bug
Historial de cambios
Versin
5.3.6
5.1.0
5.0.0
Descripcin
Se aadi php://fd.
Se
aadi php://memory y php://temp.
Se aadi php://filter.
Report a bug
Ejemplos
Ejemplo #1 php://temp/maxmemory
Este parmetro opcional permite establecer el lmite de memoria a partir del
cual php://temp comienza a usar un fichero temporal.
<?php
// Establecer el lmite a 5 MB.
$fiveMBs = 5 * 1024 * 1024;
zlib://
bzip2://
zip://
zlib:// -- bzip2:// -- zip:// Flujos de compresin
Report a bug
Descripcin
zlib: PHP 4.0.4 - PHP 4.2.3 (slo en sistemas con fopencookie)
compress.zlib:// and compress.bzip2:// PHP 4.3.0 y superior
zlib: funciona como gzopen(), solo que usando el flujo, se puede utilizar con fread() al igual que con
otras funciones del sistema de ficheros. Esto qued obsoleto en PHP 4.3.0 debido a la ambigedad
que surge con los nombres de fichero que contienen el caracter ':'; en su lugar, debe
usarsecompress.zlib://.
compress.zlib:// y compress.bzip2:// son equivalentes a gzopen() y a bzopen() respectivamente, y
funcionan incluso en sistemas que no tienen soporte para fopencookie.
La extensin ZIP registra la envoltura zip:.
Report a bug
Opciones
zlib:
compress.zlib://
compress.bzip2://
Report a bug
Opciones
Resumen de la Envoltura
Atributo
Permitido
No
Permite Lecturas
Permite Escrituras
S (excepto zip://)
S (excepto zip://)
No
Resumen de la Envoltura
Atributo
Permitido
No
No
No
data://
data:// Data (RFC 2397)
Report a bug
Descripcin
La envoltura del flujo data: ( RFC 2397) est disponible desde PHP 5.2.0.
Report a bug
Opciones
data://text/plain;base64,
Report a bug
Opciones
Resumen de la envolutra
Atributo
Permitido
No
Permite Lecturas
Permite Escrituras
No
No
Resumen de la envolutra
Atributo
Permite Lectura y Escritura
Simultanea
Permitido
No
No
No
No
No
No
Report a bug
Ejemplos
Ejemplo #1 Mostrar contenidos de data://
<?php
// muestra "I love PHP"
echo file_get_contents('data://text/plain;base64,SSBsb3ZlIFBIUAo=');
?>
glob://
glob:// Encuentra las rutas que coincidan con el patrn
Report a bug
Descripcin
La envoltura del flujo glob: est disponible desde PHP 5.3.0.
Report a bug
Opciones
glob://
Report a bug
Opciones
Resumen de la Envoltura
Atributo
Permitido
No
No
Permite Lecturas
No
Permite Escrituras
No
No
No
No
No
No
No
No
Report a bug
Ejemplos
Ejemplo #1 Uso bsico
<?php
// Recorrer todos los ficheros *.php del directorio ext/spl/examples/
// y mostrar sus nombres y tamaos
$it = new DirectoryIterator("glob://ext/spl/examples/*.php");
foreach($it as $f) {
printf("%s: %.1FK\n", $f->getFilename(), $f->getSize()/1024);
}
?>
tree.php: 1.0K
findregex.php: 0.6K
findfile.php: 0.7K
dba_dump.php: 0.9K
nocvsdir.php: 1.1K
phar_from_dir.php: 1.0K
ini_groups.php: 0.9K
directorytree.php: 0.9K
dba_array.php: 1.1K
class_tree.php: 1.8K
phar://
phar:// Archivo PHP
Report a bug
Descripcin
La envoltura de flujo phar:// est disponible desde PHP 5.3.0. Para consultar una descripcin
detallada, revise envoltura del flujo Phar.
Report a bug
Opciones
phar://
Report a bug
Opciones
Resumen de la Envoltura
Atributo
Permitido
No
No
Permite Lecturas
Permite Escrituras
No
Resumen de la Envoltura
Atributo
Permitido
ssh2://
ssh2:// Secure Shell 2
Report a bug
Descripcin
ssh2.shell:// ssh2.exec:// ssh2.tunnel:// ssh2.sftp:// ssh2.scp:// PHP 4.3.0 y superior (PECL)
Nota: Esta envoltura no est habilitada por omisin
Para poder usarse la envoltura ssh2.*:// debe instalarase la extensin SSH2 disponible en PECL.
Adems de permitir hacer un login tradicional en la URI, la envoltura ssh2 tambin puede reutilizar
las conexiones ya abiertas, proporcionando el recurso de conexin en el apartado host de la URL.
Report a bug
Opciones
ssh2.shell://usuario:contrasea@ejemplo.com:22/xterm
ssh2.exec://usuario:contrasea@ejemplo.com:22/usr/local/bin/comando
ssh2.tunnel://usuario:contrasea@ejemplo.com:22/192.168.0.1:14
ssh2.sftp://usuario:contrasea@ejemplo.com:22/ruta/a/fichero
Report a bug
Opciones
Resumen de la Envoltura
Atributo
Restringido por allow_url_fopen
ssh2.sftp
S
ssh2.scp
S
Resumen de la Envoltura
Atributo
ssh2.sftp
ssh2.scp
Permite Lecturas
Permite Escrituras
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
Opciones de contexto
Nombre
Uso
session
sftp
methods
callbacks
username
password
pubkey_fil
Nombre del fichero con la clave pblica que se usar para autenticar
Opciones de contexto
Nombre
Uso
e
privkey_fil
e
Nombre del fichero con la clave privada que se usar para autenticar
env
term
term_widt
h
term_heigh
t
term_units
SSH2_TERM_UNIT_CHAR
S
Report a bug
Ejemplos
Ejemplo #1 Abriendo un flujo a partir de una conexin activa
<?php
$session = ssh2_connect('example.com', 22);
ssh2_auth_pubkey_file($session, 'username', '/home/username/.ssh/id_rsa.pub',
'/home/username/.ssh/id_rsa', 'secret');
$stream = fopen("ssh2.tunnel://$session/remote.example.com:1234", 'r');
?>
rar://
rar:// RAR
Report a bug
Descripcin
Esta envoltura se compone de una ruta al fichero RAR (relativa o absoluta) codificada como URL, un
asterisco opcional (*), un signo de nmero opcional (#) y un nombre de entrada codificado como
URL que tambin es opcional, tal como se almacena en el fichero. Cuando se especifique un nombre
de entrada, ser necesario tambin especificar un signo de nmero; adems, se puede aadir al final
del nombre una barra.
Esta envoltura puede abrir tanto ficheros como directorios. Cuando se abre un directorio, el signo
asterisco obliga a que los nombres de las entradas del directorio se devuelvan decodificados. Si no se
especifica, se devolvern codificadas como URL esto es as para permitir hacer un uso correcto de
la envoltura con determinadas funcionalidades, como RecursiveDirectoryIterator cuando se est en
presencia de nombres de ficheros que podran parecen datos codificados como URL.
Si no se proporciona ni un signo de nmero ni tampoco un nmero de entrada, se mostrar la raz
del fichero. La diferencia respecto a directorios convencionales es que el flujo no contendr
determinada informacin, tal como la fecha de modificacin, dado que el directorio raz no se
almacena dentro el fichero comprimido en de una entrada individual. Para usar la envoltura
con RecursiveDirectoryIterator es necesario que al acceder al raz se incluya el signo de nmero en la
URL, para que as las URLs de los nodos hijo se puedan construir correctamente.
Nota: Esta envoltura no est habilitada por omisin
Para poder usar la envoltura rar://, debe instalarse la extensin rar disponible en PECL.
rar:// Disponible desde PECL rar 3.0.0
Report a bug
Opciones
rar://<nombre de archivo con codificacin url>[*][#[<nombre de entrada con codificacin
url>]]
Report a bug
Opciones
Resumen de la Envoltura
Atributo
Permitido
No
No
Permite Lecturas
Permite Escrituras
No
No
No
No
Resumen de la Envoltura
Atributo
Permitido
No
No
No
Opciones de contexto
Nombre
Uso
Si la hubiera, contrasea utilizada para encriptar las cabeceras del archivo. WinRAR
encriptar todos los ficheros con la misma contrasea que la cabecera siempre que sta
open_password
est presente, por lo que se ignorar file_password en archivos que contengan cabeceras
encriptadas.
file_password
volume_callbac Llamada de retorno que determina la ruta de las partes que no se hayan podido
k
capturar. Para ms informacin, revise RarArchive::open().
Report a bug
Ejemplos
Ejemplo #1 Recorriendo un archivo RAR
<?php
class MyRecDirIt extends RecursiveDirectoryIterator {
function current() {
return rawurldecode($this->getSubPathName()) .
(is_dir(parent::current())?" [DIR]":"");
}
}
$f = "rar://" . rawurlencode(dirname(__FILE__)) .
DIRECTORY_SEPARATOR . 'dirs_and_extra_headers.rar#';
$it = new RecursiveTreeIterator(new MyRecDirIt($f));
Valor por
omisin
[ino] => 0
[mode] => 33206
[nlink] => 1
[uid] => 0
[gid] => 0
[rdev] => 0
[size] => 26
[atime] => 0
[mtime] => 1259550052
[ctime] => 0
[blksize] => -1
[blocks] => -1
)
ogg://
ogg:// Flujos de audio
Report a bug
Descripcin
Los ficheros que se abran para lectura usando la envoltura ogg:// se utilizan como codificaciones de
audio comprimido usando el cdec OGG/Vorbis. De forma similar, los ficheros abiertos para
escritura o para aadir contenido usando la envoltura ogg:// se escriben como datos de audio
comprimidos. Cuando se use la funcin stream_get_meta_data() con un fichero OGG/Vorbis abierto
para lectura, se devolvern diversos detalles del flujo, incluyendo la etiqueta vendor,
cualquier comments que se haya aadido, el nmero de canales channels, el ratio de muestreo, y el
rango del ratio de codificacin descrito por: bitrate_lower, bitrate_upper, bitrate_nominal,
y bitrate_window.
ogg:// PHP 4.3.0 and up (PECL)
Nota: Esta envoltura no est habilitada por omisin
Para usar la envoltura ogg:// es necesario instalar la extensin OGG/Vorbis disponible en PECL.
Report a bug
Opciones
ogg://soundfile.ogg
ogg:///path/to/soundfile.ogg
ogg://http://www.example.com/path/to/soundstream.ogg
Report a bug
Opciones
Resumen de la Envoltura
Atributo
Permitido
No
Permite Lecturas
Permite Escrituras
No
No
No
No
No
No
Opciones de contexto
Nombr
e
Uso
Valor por
omisin
pcm_
mode
OGGVORBIS_PC
M_S16_LE
rate
bitrat
e
Modo
Lectura
44100
Escritura/
Adicin
128000
Escritura/
Adicin
Opciones de contexto
Nombr
e
Valor por
omisin
Uso
Modo
Escritura/
Adicin
Escritura/
Adicin
expect://
expect:// Flujos de Interaccin de Procesos
Report a bug
Descripcin
Los flujos que se hayan abierto con la envoltura expect://, darn acceso a stdio, stdout y stderr
(entrada, salida y errores estndar respectivamente) de los procesos, va PTY.
Nota: Esta envoltura no est habilitada por omisin
Para poder usar la envoltura expect:// se debe instalar la extensin Expect disponible en PECL.
expect:// PHP 4.3.0 y superior (PECL)
Report a bug
Opciones
expect://command
Report a bug
Opciones
Resumen de la Envoltura
Atributo
Restringido por allow_url_fopen
Permitido
No
Resumen de la Envoltura
Atributo
Permitido
Permites Lecturas
Permite Escrituras
No
No
No
No
No
No
No
Seguridad
Introduccin
PHP es un potente lenguaje, y su intrprete, bien como mdulo del servidor web o bien como
binario CGI, puede acceder a ficheros, ejecutar comandos o abrir conexiones de red desde el
servidor. Estas propiedades hacen que, por omisin, sea inseguro todo lo que se ejecute en un
servidor web. PHP est diseado especficamente para ser un lenguaje ms seguro para escribir
aplicaciones CGI que Perl or C. Partiendo de un correcto ajuste de opciones de configuracin para
tiempo de ejecucin y en tiempo de compilacin, y el uso de prcticas de programacin apropiadas,
pueden proporcionarle la combinacin de libertad y de seguridad que necesita.
Dado que hay muchas vas para ejecutar PHP, existen muchas opciones de configuracin para
controlar su comportamiento. Al haber una extensa seleccin de opciones se garantiza poder usar
PHP para un gran nmero de propsitos, pero a la vez significa que existen combinaciones que
conllevan una configuracin menos segura.
La flexibilidad de configuracin de PHP rivaliza igualmente con la flexibilidad de su cdigo. PHP puede
ser usado para construir completas aplicaciones de servidor, con toda la potencia de un usuario de
consola, o se puede usar slo desde el lado del servidor implicando un menor riesgo dentro de un
entorno controlado. El cmo construir ese entorno, y cmo de seguro es, depende del desarrollador
PHP.
Este captulo comienza con algunos consejos generales de seguridad, explica las diferentes
combinaciones de opciones de configuracin y las situaciones en que pueden ser tiles, y describe
diferentes consideraciones relacionadas con la programacin de acuerdo a diferentes niveles de
seguridad.
Consideraciones generales
Un sistema completamente seguro es prcticamente un imposible, de modo que el enfoque usado
con mayor frecuencia en la profesin de seguridad es uno que busque el balance adecuado entre
riesgo y funcionalidad. Si cada variable enviada por un usuario requiriera de dos formas de validacin
biomtrica (como rastreo de retinas y anlisis dactilar), usted contara con un nivel extremadamente
alto de confiabilidad. Tambin implicara que llenar los datos de un formulario razonablemente
complejo podra tomar media hora, cosa que podra incentivar a los usuarios a buscar mtodos para
esquivar los mecanismos de seguridad.
La mejor seguridad con frecuencia es lo suficientemente razonable como para suplir los
requerimientos dados sin prevenir que el usuario realice su labor de forma natural, y sin sobrecargar
al autor del cdigo con una complejidad excesiva. De hecho, algunos ataques de seguridad son
simples recursos que aprovechan las vulnerabilidades de este tipo de seguridad sobrecargada, que
tiende a erosionarse con el tiempo.
Una frase que vale la pena recordar: Un sistema es apenas tan bueno como el eslabn ms dbil de
una cadena. Si todas las transacciones son registradas copiosamente basndose en la fecha/hora,
ubicacin, tipo de transaccin, etc. pero la verificacin del usuario se realiza nicamente mediante
una cookie sencilla, la validez de atar a los usuarios al registro de transacciones es mermada
severamente.
Cuando realice pruebas, tenga en mente que no ser capaz de probar todas las diferentes
posibilidades, incluso para las pginas ms simples. Los datos de entrada que usted puede esperar en
sus aplicaciones no necesariamente tendrn relacin alguna con el tipo de informacin que podra
ingresar un empleado disgustado, un cracker con meses de tiempo entre sus manos, o un gato
domstico caminando sobre el teclado. Es por esto que es mejor observar el cdigo desde una
perspectiva lgica, para determinar en dnde podran introducirse datos inesperados, y luego hacer
un seguimiento de cmo esta informacin es modificada, reducida o amplificada.
Internet est repleto de personas que tratan de crearse fama al romper la seguridad de su cdigo,
bloquear su sitio, publicar contenido inapropiado, y por lo dems haciendo que sus das sean ms
interesantes. No importa si usted administra un sitio pequeo o grande, usted es un objetivo por el
simple hecho de estar en lnea, por tener un servidor al cual es posible conectarse. Muchas
aplicaciones de cracking no hacen distinciones por tamaos, simplemente recorren bloques masivos
de direcciones IP en busca de vctimas. Trate de no convertirse en una.
Ataques posibles
Usar PHP como un binario CGI es una opcin para configuraciones que por alguna razn no desean
integrar PHP como un mdulo dentro del software de servidor (como Apache), o usarn PHP con
diferentes tipos de envoltorios CGI para crear entornos seguros chroot y setuid para scripts. Esta
configuracin usualmente involucra la instalacin del binario ejecutable de PHP en el directorio cgi-bin
del servidor web. La recomendacin CA-96.11 del CERT recomienda que est en contra de colocar
cualquiera de los intrpretes dentro de cgi-bin. An si el binario de PHP puede ser usado como un
intrprete independiente, PHP est diseado para prevenir los ataques que esta configuracin hace
posible:
Accediendo a los ficheros del sistema: http://mi.servidor/cgi-bin/php?/etc/passwd La consulta
de informacin en una URL despus del signo de interrogacin (?) es pasado como argumento
de la lnea de comandos al intrprete por la interface del CGI. Usualmente los intrpretes
abren y ejecutan el fichero especificado como el primer argumento en la lnea de
comandos. Cuando es invocado como un binario de CGI, PHP se rehusa a interpretar los
argumentos de lnea de comandos.
Accediendo a cualquier documento web en el servidor: http://mi.servidor/cgibin/php/directorio/secreto/doc.html Parte de la ruta de informacin de la URL despus del
nombre del binario de PHP, /directorio/secreto/doc.html es convencionalmente utilizado para
especificar el nombre del fichero a ser abierto e interpretado por el programa CGI. Usualmente
las directivas de configuracin de algunos servidores web (Apache: Accin) son utilizados para
redirigir peticiones a los documentos como http://mi.servidor/directorio/secreto/script.php al
intrprete de PHP. Con esta configuracin, el servidor web revisa primero los permisos de
acceso a los directorios /directorio/secreto, y despus crea la peticin
redirigida http://mi.servidor/cgi-bin/php/directorio/secreto/script.php. Desafortunadamente, si
la peticin es proporcionada originalmente en esta forma, no se revisan los accesos a los
directorios hechos por el servidor web /directorio/secreto/script.php, sino solamente al
fichero /cgi-bin/php. De esta forma /cgi-bin/php cualquier usuario est habilitado a acceder a
cualquier documento protegido en el servidor web. En PHP, las directivas de configuracin en
tiempo de ejecucincgi.force_redirect, doc_root y user_dir pueden ser utilizadas para prevenir
este ataque, si el rbol de documentos del servidor tiene cualquiera de estos directorios con
restricciones de acceso. Vase ms abajo para una explicacin completa de las diferentes
combinaciones.
Esta opcin ha sido probada solamente con el servidor web Apache, y se basa en que en Apache se
configure en una variable de entorno no-estndar de CGIREDIRECT_STATUS para peticiones de
redireccin. Si su servidor web no soporta ninguna forma de decirle si la peticin es directa o
redirigida, usted no puede utilizar esta opcin y debe usar una de las otras formas de ejecutar la
versin CGI aqu documentadas.
como la primera lnea de cualquier fichero que contenga etiquetas de PHP. Tambin necesitar hacer
que el fichero sea ejecutable. Eso significa, tratarlo exactamente como tratara cualquier otro script
de CGI escrito en Perl, sh, bash, o cualquier otro lenguaje comn de script el cual utilice #! como
mecanismo de ejecucin de si mismo.
Para que PHP maneje la informacin correctamente de PATH_INFO y PATH_TRANSLATED con esta
configuracin, el analizador de PHP debera ser compilado con la opcin de configuracin --enablediscard-path.
Cuando PHP es usado como un mdulo de Apache, hereda los permisos del usuario de Apache
(generalmente los del usuario "nobody"). Este hecho representa varios impactos sobre la seguridad y
las autorizaciones. Por ejemplo, si se est usando PHP para acceder a una base de datos, a menos
que tal base de datos disponga de un control de acceso propio, se tendr que hacer que la base de
datos sea asequible por el usuario "nobody". Esto quiere decir que un script malicioso podra tener
acceso y modificar la base de datos, incluso sin un nombre de usuario y contrasea. Es
completamente posible que una araa(bot) web pudiera toparse con la pgina web de administracin
de una base de datos, y eliminar todo de la base de datos. Una proteccin ante este tipo de
situaciones es mediante el uso del mecanismo de autorizacin de Apache, o con modelos de acceso
de diseo propio usando LDAP, archivos .htaccess, etc. e incluir ese cdigo como parte de los
scripts PHP.
Con frecuencia, una vez la seguridad se ha establecido en un punto en donde el usuario de PHP (en
este caso, el usuario de apache) tiene asociada muy poco riesgo, se descubre que PHP se encuentra
ahora imposibilitado de escribir archivos en los directorios de los usuarios. O quizs se le haya
desprovisto de la capacidad de acceder o modificar bases de datos. Se ha prevenido que pudiera
escribir tanto archivos buenos como malos, o que pudiera realizar transacciones buenas o malas en la
base de datos.
Un error de seguridad cometido con frecuencia en este punto es darle permisos de administrador
(root) a apache, o incrementar las habilidades del usuario de apache de alguna otra forma.
Incrementar los permisos del usuario de Apache hasta el nivel de administrador es extremadamente
peligroso y puede comprometer al sistema entero, as que el uso de entornos sudo, chroot, o
cualquier otro mecanismo que sea ejecutado como root no debera ser considerado como una opcin
por aquellos que no son profesionales en seguridad.
Existen otras soluciones ms simples. Mediante el uso de open_basedir se puede controlar y
restringir qu directorios pueden ser usados por PHP. Tambin se pueden definir reas solo-Apache,
para restringir todas las actividades basadas en web a archivos que no son de usuarios o del sistema.
unlink("$homedir/$userfile");
echo "El archivo ha sido eliminado!";
?>
Dado que el nombre de usuario y el nombre del archivo son enviados desde un formulario, estos
pueden representar un nombre de archivo y un nombre de usuario que pertenecen a otra persona,
incluso se podra borrar el archivo a pesar que se supone que no estara permitido hacerlo. En este
caso, usted deseara usar algn otro tipo de autenticacin. Considere lo que podra suceder si las
variables enviadas son "../etc/" y "passwd". El cdigo entonces se ejecutara efectivamente como:
Ejemplo #2 ... Un ataque al sistema de archivos
<?php
// elimina un archivo desde cualquier lugar en el disco duro al que
// el usuario de PHP tiene acceso. Si PHP tiene acceso de root:
$username = $_POST['user_submitted_name']; // "../etc"
$userfile = $_POST['user_submitted_filename']; // "passwd"
$homedir = "/home/$username"; // "/home/../etc"
unlink("$homedir/$userfile"); // "/home/../etc/passwd"
echo "El archivo ha sido eliminado!";
?>
Hay dos medidas importantes que usted debe tomar para prevenir estas cuestiones.
nicamente permisos limitados al usuario web de PHP.
Revise todas las variables que se envan.
Aqu est una versin mejorada del script:
Ejemplo #3 Comprobacin ms segura del nombre de archivo
<?php
// elimina un archivo del disco duro al que
// el usuario de PHP tiene acceso.
$username = $_SERVER['REMOTE_USER']; // usando un mecanismo de autenticacin
$userfile = basename($_POST['user_submitted_filename']);
$homedir = "/home/$username";
$filepath = "$homedir/$userfile";
if (file_exists($filepath) && unlink($filepath)) {
$logstring = "Se ha eliminado $filepath\n";
} else {
$logstring = "No se ha podido eliminar $filepath\n";
}
$fp = fopen("/home/logging/filedelete.log", "a");
fwrite($fp, $logstring);
fclose($fp);
echo htmlentities($logstring, ENT_QUOTES);
?>
Sin embargo, incluso esto no est exento de defectos. Si la autenticacin del sistema permite a los
usuarios crear sus propios inicios de sesin de usuario, y un usuario eligi la entrada "../etc/", el
sistema est expuesto una vez ms. Por esta razn, puede que prefiera escribir un chequeo ms
personalizado:
Ejemplo #4 Comprobacin ms segura del nombre de archivo
<?php
$username
$userfile
$homedir
$filepath
= "$homedir/$userfile";
Dependiendo de sus sistema operativo, hay una gran variedad de archivos a los que debe estar
atento, esto incluye las entradas de dispositivos (/dev/ o COM1), archivos de configuracion (archivos
/etc/ y archivos .ini), las muy conocidas carpetas de almacenamiento (/home/, Mis documentos), etc.
Por esta razn, por lo general es ms fcil crear una poltica en donde se prohba todo excepto lo que
expresamente se permite.
tenga xito en exponer o abusar de cualquier informacin que tenga almacenada. El buen diseo del
esquema de la base de datos y de la aplicacin se ocupar de sus mayores temores.
encripta los datos antes de insertarlos dentro de la base de datos, y los desencripta cuando los
devuelve. Vea las referencias para ejemplos adicionales de como funciona la encripcin.
En caso de datos que deben estar ocultos, si no fuera necesario usar su representacin real (es decir,
que no se mostrarn), quizs convenga utilizar hashing. El ejemplo ms tpico de hashing es cuando
se almacena el hash MD5 de una contrasea en una base de datos, en lugar de almacenar la
contrasea en s misma. Vea tambin las funciones crypt() y md5().
Ejemplo #1 Utilizando campos de contrasea con hash
<?php
// Almacenando la contrasea con hash
// $random_chars se obtuvo, p.ej., usando /dev/random
$query = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",
pg_escape_string($username),
pg_escape_string(crypt($password, '$2a$07$' . $random_chars . '$')));
$result = pg_query($connection, $query);
// Consultando si el usuario envi la contrasea correcta
$query = sprintf("SELECT pwd FROM users WHERE name='%s';",
pg_escape_string($username));
$row = pg_fetch_assoc(pg_query($connection, $query));
if ($row && crypt($password, $row['pwd']) == $row['pwd']) {
echo 'Bienvenido, ' . htmlspecialchars($username) . '!';
} else {
echo 'La autenticacin ha fallado para ' . htmlspecialchars($username) . '.';
}
?>
Inyeccin de SQL
Muchos desarrolladores web son desprevendios de cmo las consultas SQL pueden ser manipuladas,
y asumen que una consulta SQL es un comando confiable. Esto significa que las consultas SQL estn
expuestas a que sean malversadas en controles de acceso, y por lo tanto, sobrepasar las revisiones
de autenticacin y autorizacin estndar, y que algunas veces las consultas SQL an podran permitir
el acceso de comandos a nivel de sistema operativo del ordenador.
Comandos directos de Inyeccin SQL es una tcnica donde un atacante crea o altera comandos SQL
existentes para exponer datos ocultos, sobreponerse a los que son importantes, o peor an, ejecutar
comandos peligrosos a nivel de sistema en el equipo donde se encuentra la base de datos. Esto se
logra a travs de la aplicacin, tomando la entrada del usuario y combinndola con parmetros
estticos para elaborar una consuta SQL. Los siguientes ejemplos estn basados en historias reales,
desafortunadamente.
Debido a la falta de validacin en la entrada de datos y conectndose a la base de datos con
privilegios de super usuario o de alguien con privilegios que puede crear usuarios, el atacante podra
crear un super usuario en su base de datos.
Ejemplo #1 Dividiendo el conjunto de resultados en pginas ... y haciendo super usuarios
(PostgreSQL)
<?php
$offset = $argv[0]; // Cuidado, no hay validacin en la entrada de datos!
$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
$result = pg_query($conn, $query);
?>
Los usuarios normales dan clic en los enlaces 'siguiente' o 'atras' donde $offset est codificado en
la URL. El script espera que el $offset entrante sea un nmero dcimal. Sin embargo, qu pasa si
alguien intenta irrumpir aadiendo una funcin urlencode() al formulario de la siguiente URL
0;
insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)
select 'crack', usesysid, 't','t','crack'
from pg_shadow where usename='postgres';
--
Si esto sucedi, entonces el script podra presentarle un acceso de super usuario al atacante. Ntese
que 0; es para proveer un offset vlido a la consulta original y para finalizarla.
Nota:
Esta es una tcnica comn para forzar al analizador SQL a que ignore el resto de la consulta escrita
por el desarrollador con dos guines: -- los cuales representan un comentario en SQL.
Una forma factible de obtener contraseas es burlar las pginas de bsqueda de resultados. Lo nico
que el atacante necesita hacer es ver si hay variables que hayan sido enviadas y sean usadas en
declaraciones SQL las cuales no sean manejadas apropiadamente. Esos filtros pueden ser puestos
comunmente en un formulario anterior para personalizar las clusulas WHERE, ORDER BY,
LIMIT y OFFSET en las declaraciones SELECT. Si su base de datos soporta el constructor UNION,
el atacante podra intentar aadir una consulta enetera a la consulta original para listar contraseas
de una tabla arbitraria. Utilizar campos de contrasea encriptadoslds es fuertemente recomendado.
Ejemplo #2 Listando nuestros artculos ... y algunas contraseas (de cualquier servidor
de base de datos)
<?php
$query
La parte esttica de la consulta puede ser combinada con otra declaracin SELECT la cual revela
todas las contraseas:
'
union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable;
--
Si esta consulta (ejecutndose con ' y --) fuera asignada a una de las variables utilizadas en $query,
la consulta reaccionar bestialmente.
Las consultas de actualizacin de SQL, tambin son susceptibles a ataques. Estas consultas tambin
son amenazadas por acortamiento y adicin en una consulta completamente nueva a esta. Sin
embargo el atacante podra manipularla con la clusula SET. En este caso, algunos esquemas de
informacin deben ser procesados para manipular la consulta exitosamente. Este puede adquirirse
examinando la forma de nombres de las variables, o simplemente forzarlo con un ataque de fuerza
bruta. No hay muchas convenciones de nombres para campos que almacenan contraseas o nombres
de usuarios.
Ejemplo #3 Desde re-establecer una contrasea ... hasta ganar ms privilegios (en
cualquier servidor de bases de datos)
<?php
$query = "UPDATE usertable SET pwd='$pwd' WHERE uid='$uid';";
?>
Pero un usuario malicioso podra enviar el valor ' or uid like'%admin% a $uid para cambiar la
contrasea del administrador, o simplemente cambiar $pwd ahehehe', trusted=100,
admin='yes para obtener ms privilegios. Entonces, la consulta sera cambiada:
<?php
// $uid: ' or uid like '%admin%
$query = "UPDATE usertable SET pwd='...' WHERE uid='' or uid like '%admin%';";
// $pwd: hehehe', trusted=100, admin='yes
$query = "UPDATE usertable SET pwd='hehehe', trusted=100, admin='yes' WHERE
...;";
?>
Un ejemplo horrible de cmo pueden ser accedidos los comandos a nivel de sistema operativo en
algunos hospedadores de bases de datos.
Ejemplo #4 Atacando el sistema operativo que hospeda la base de datos (Servidor
MSSQL)
<?php
$query = "SELECT * FROM products WHERE id LIKE '%$prod%'";
$result = mssql_query($query);
?>
Si un atacante enva el valor a%' exec master..xp_cmdshell 'net user test testpass /ADD' -hacia $prod, la consulta $query ser:
<?php
$query
El servidor MSSQL ejecuta la sentencia SQL en el lote que incluye un comando para aadir un usuario
nuevo a la base de datos de cuentas locales. Si esta aplicacin estuviera ejecutndose como sa, y el
servicio MSSQLSERVER se est ejecutando con los privilegios suficientes, el atacante ahora podra
tener una cuenta con la cual tendra acceso a esta mquina.
Nota:
Algunos de los ejemplos de citados arriba estan vinculados a un servidor de base de datos especfico.
Esto no significa que un ataque similar sea imposible en contra de otros productos. Su servidor de
base de datos podra ser vulnerable de forma similar en otra manera.
Tcnicas de evitacin
Pese a que pueda parecer obvio que un atacante debe tener al menos algn conocimiento de
arquitecturas de bases de datos para poder realizar un ataque con xito, el obtener esta informacin
suele ser muy sencillo. Por ejemplo, cuando la base de datos forma parte de un paquete de software
libre, o disponible pblicamente, con una instalacin predefinida, esta informacin se encuentra
completamente libre y disponible. Esta informacin puede haber sido divulgada en proyectos de
cdigo cerrado - incluso si est codificad, ofuscada o compilada - incluso por el propio cdigo
mediante mensajes de error. Otros mtodos incluyen el uso de nombres de tablas y columnas
frecuentes. Por ejemplo, un formulario de inicio de sesin que utiliza una tabla 'users' con los
nombres de columna 'id', 'username', y 'password'.
Esos ataques estn principalmente basados en explotar el cdigo que no ha sido escrito teniendo en
mente la seguridad. Nunca confes en ningn tipo de entrada, especialmente la que viene del lado del
cliente, an cuando esta venga de una caja de seleccin, un campo oculto o una cookie. El primer
ejemplo muestra que una inofensiva consulta puede causar desastres.
Nunca se conecte como super usuario o como el propietario de la base de datos. Siempre
utilice usuarios personalizados con privilegios muy limitados.
Use sentencias preparadas con variables vinculadas. Son proporcionadas por PDO, MySQLi y
otras bibliotecas.
Revise si la entrada proporcionada tiene el tipo de datos que se espera. PHP tiene un rango
amplio de funciones para validar la entrada de datos, desde las ms simples encontradas
en Funciones de variable y en Funciones de tipo
Caracter (Ej. is_numeric(), ctype_digit() respectivamente) y siguiendo el apoyo con
las Expresiones regulares compatibles con Perl.
Si la expresin espera una entrada numrica, considere verificar los datos con la
funcin ctype_digit(), o silenciosamente cambie su tipo utilizandosettype(), o use su
representacin numrica por medio de sprintf().
Ejemplo #5 Una forma ms segura de redactar una consulta para paginacin
<?php
settype($offset, 'integer');
$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
// Fjese en %d en el formato de cadena, utilizar %s podra no tener un resultado significa
tivo
$query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;",
$offset);
?>
Reportando errores
Con la seguridad de PHP, hay dos formas para reportar errores. Una es en beneficio, para
incrementar la seguridad, y la otra es para perjudicar.
Una tctica estndar de ataque conlleva a perfilar un sistema; llenndolo de datos incorrectos,
revisando los tipos y contextos de los errores que son devueltos. Esto le permite al atacante
recolectar informacin acerca del servidor, para determinar posibles debilidades. Por ejemplo, si un
atacante ha recogido informacin sobre una pgina basada en un envo previo, l podra intentar
sobrescribir las variables, o modificarlas:
Ejemplo #1 Atacando variables con una pgina HTML personalizada
<form method="post" action="objetivodelataque?username=badfoo&password=badfoo">
<input type="hidden" name="username" value="badfoo" />
<input type="hidden" name="password" value="badfoo" />
</form>
Los errores de PHP que normalmente son devueltos, pueden ser muy tiles para el desarrollador que
est intentando depurar un script, indicando qu cosas, como por ejemplo, qu funcin o qu fichero
de PHP fall, y el nmero de lnea en donde la falla ocurri. Toda esta es la informacin que puede
ser explotada. Esto no es algo raro para un desarrollador de PHP que utilice las
Sin importar el mtodo de manejo de errores, la capacidad de probar errores en un sistema conlleva
a proveer a un atacante con mas informacin.
Por ejemplo, el estilo comn de un error genrico de PHP indica que un sistema ciertamente est
ejecutando PHP. Si un atacante est en una pgina .html, y quiere probar qu motor hay tras de ese
servidor (para buscar debilidades en el sistema), lo alimenta con datos errneos que lo podran
habilitar a que determine que ese sistema fue construido con PHP.
El error de una funcin puede indicar ya sea, un sistema que puede estar ejecutando un motor
especfico de base de datos, o dar las pistas de cmo una pgina web puede estar programada o
diseada. Esto permite una investigacin ms profunda dentro de los puertos abiertos de la base de
datos, o buscar errores especficos o debilidades en una pgina web. Pasando diferentes porciones de
datos errneos, por ejemplo, un atacante puede determinar el orden de autenticacin en un script,
(por medio del nmero de lnea de los errores) como tambin probar exploits que pueden ser
utilizados en diferentes ubicaciones del script.
Un error del sistema de archivos o un error general de PHP puede indicar qu permisos tiene el
servidor web, as tambin la estructura y organizacin de ficheros en el servidor web. El cdigo de
error escrito por el desarrollador puede agravar este problema, conllevando a la explotacin fcil de
la, hasta entonces, informacin "oculta".
Hay tres grandes soluciones a este problema. La primera consiste en examinar todas las funciones, e
intentar arreglar la mayora de los errores. La segunda es deshabilitar completamente la notificacin
de errores de el cdigo en ejecucin. La tercera es utilizar las funciones de manejo de error propias
de PHP para crear su propio manejador de errores. Dependiendo de su poltica de seguridad, puede
ser que encuentre que las tres sean aplicables a su situacin.
Una forma de detectar este problema por adelantado es hacer uso de la funcin propia de
PHP error_reporting(), para ayudarle a asegurar su cdigo y encontrar el uso de variables que
podran ser peligrosas. Al probar su cdigo, antes de distribuirlo, con E_ALL, usted puede encontrar
rapidamente reas donde sus variables pueden ser abiertas para envenenamiento o modificacin en
otras maneras. Una vez usted est listo para distribuirlo, debera deshabilitar completamente el
reporte de errores poniendo el valor de error_reporting() a 0, o apagar el visor de errores utilizando
la opcin display_errors del ficherophp.ini para aislar su cdigo de ataques. Si decide hacer esto
ltimo, tambin debera definir la ruta de acceso a su archivo de registros utilizando la
directivaerror_log, y poner log_errors en "on".
Ejemplo #3 Buscando variables peligrosas con E_ALL
<?php
if ($usuario) { // No se ha inicializado o revisado antes de utilizar
$permitir_acceso = 1;
}
if ($permitir_acceso == 1) { // Si la prueba anterior falla, los que no estn inicializados o comp
}
?>
Cuando est register_globals = on, la lgica anterior podra verse comprometida. Cuando est
deshabilitada, $authorized no puede definirse a travs de peticiones, as que estar bien, aunque
realmente en general es una buena prctica de programacin inicializar las variables primero. Por
ejemplo, en el ejemplo anterior se puede haber realizado primero algo como $authorized = false.
Hacer esto primero significa que el cdigo anterior podra funcionar con register_globals activado o
desactivado ya que los usuarios de forma predeterminada no seran autorizados.
Otro ejemplo es aquel de las sesiones. Cuando est register_globals = on, se puede usar
tambin $username en el siguiente ejemplo, pero nuevamente se debe notar
que $username tambin puede provenir de otros medios, tal como GET (a travs de la URL).
Ejemplo #2 Ejemplo de uso de sesiones con register_globals on u off
<?php
// No se sabra por dnde proviene $username, pero se sabe que $_SESSION es
// para datos de sesin.
if (isset($_SESSION['username'])) {
echo "Hello <b>{$_SESSION['username']}</b>";
} else {
echo "Hello <b>Guest</b><br />";
echo "Would you like to login?";
}
?>
Incluso es posible tomar medidas preventivas para advertir cuando se haga un intento de
falsificacin. Si se sabe previamente con exactitud el lugar de donde una variable debera provenir, se
puede verificar si los datos enviados provienen de una clase inapropiada de sumisin. Si bien no
garantiza que los datos no han sido falsificados, esto requiere que un atacante adivine el medio
apropiado para falsificar. Si no importa de donde provienen los datos requeridos, se puede
usar $_REQUEST ya que contiene una mezcla de datos GET, POST y COOKIE. Ver tambin la seccin
del manual sobre el uso de variables desde fuentes externas sources.
Ejemplo #3 Deteccin de envenenamiento simple de variables
<?php
if (isset($_COOKIE['MAGIC_COOKIE'])) {
// MAGIC_COOKIE viene de una cookie.
// Asegrese de validar la informacin de la cookie!
} elseif (isset($_GET['MAGIC_COOKIE']) || isset($_POST['MAGIC_COOKIE'])) {
mail("admin@example.com", "Posible intento de ataque", $_SERVER['REMOTE_ADDR']);
echo "Violacin de seguridad, el administrador ha sido alertado.";
exit;
} else {
// MAGIC_COOKIE no se establece a travs de este REQUEST
}
?>
Por supuesto, simplemente deshabilitar register_globals no quiere decir que su cdigo es seguro.
Cada pieza de datos que es remitida, tambin debe ser verificada de otras formas. Siempre valide
los datos de los usuarios e inicialice sus variables! Para chequear por variables no inicializadas, se
puede usarerror_reporting() para mostrar errores de nivel E_NOTICE.
Para obtener informacin sobre la emulacin de register_globals activado o desactivado, consulte
este FAQ.
Nota: Nota de disponibilidad de Superglobals
Los arrays Superglobal como $_GET, $_POST y $_SERVER, etc. estn disponibles desde PHP 4.1.0.
Para ms informacin, lea la seccin del manual ensuperglobals
Usted debera examinar siempre, y cuidadosamente su cdigo para asegurarse de que cualquier
variable siendo enviada desde un navegador web sea chequeada apropiadamente, y preguntarse a s
mismo:
Este script afectar nicamente los archivos que se pretende?
Puede tomarse accin sobre datos inusuales o indeseados?
Puede ser usado este script en formas malintencionadas?
Puede ser usado en conjunto con otros scripts en forma negativa?
Sern adecuadamente registradas las transacciones?
Al preguntarse adecuadamente estas preguntas mientras escribe su script, en lugar de hacerlo
posteriormente, usted previene una desafortunada re-implementacin del programa cuando desee
incrementar el nivel de seguridad. Al comenzar con esta mentalidad, no garantizar la seguridad de
su sistema, pero puede ayudar a mejorarla.
Puede que tambin desee considerar la deshabilitacin de register_globals, magic_quotes, u otros
parmetros convenientes que pueden causar confusin sobre la validez, fuente o valor de una
determinada variable. Trabajar con PHP en modo error_reporting(E_ALL) tambin puede ayudarle a
advertir variables que estn siendo usadas antes de ser chequeadas o inicializadas (de modo que
puede prevenir que datos inusuales produzcan operaciones inadvertidas).
Comillas Mgicas
Advertencia
Esta caracterstica ha sido declarada OBSOLETA desde PHP 5.3.0 y ELIMINADA a partir de PHP
5.4.0.
Las comillas mgicas son un procedimiento que automgicamente limpian los datos de entrada de un
script PHP. Es aconsejable trabajar con las comillas mgicas deshabilitadas y, en su lugar, hacer un
filtrado en tiempo de ejecucin y bajo demanda.
Por qu usarlas
Advertencia
Esta caracterstica ha sido declarada OBSOLETA desde PHP 5.3.0 y ELIMINADA a partir de PHP
5.4.0.
Dado que se han declarado obsoletas PHP, no hay ninguna razn para usarlas. Sin embargo,
todava estn ah y ayudan a los programadores noveles a escribir un mejor cdigo (ms
seguro). Sin embargo, si trabaja con cdigo que dependa de este comportamiento, es
preferible actualizar el cdigo a tener que habilitar las comillas mgicas. Entonces por qu
existen? Sencillo, para ayudar a prevenir ataques de Inyeccin SQL. Hoy, los desarrolladores
son ms cuidadosos con la seguridad y acaban empleando los mecanismos de escapado
especficos de cada base de datos y/o declaraciones preparadas en lugar de depender de
funcionalidades como las comillas mgicas.
Por qu no usarlas
Advertencia
Esta caracterstica ha sido declarada OBSOLETA desde PHP 5.3.0 y ELIMINADA a partir de PHP
5.4.0.
Portabilidad El asumir que estn habilitadas, o no, afecta a su portabilidad. Para comprobarlo,
utilice get_magic_quotes_gpc() para as programar como corresponda.
Rendimiento Dado que no todos los datos que se escapen se insertarn en una base de datos,
existe un impacto negativo en el rendimiento escapando todos estos datos. Es ms eficiente
llamar a las funciones de escapado (como addslashes()) en tiempo de ejecucin. A pesar de
que en php.ini-development se habilitan por omisin estas directivas, en php.ini-production se
deshabilitan. El motivo de esta recomendacin es sobre todo debido a motivos de rendimiento.
Inconvenientes Dado que no todos los datos necesitan escapado, a menudo resulta molesto
ver datos escapados cuando no deberan. Por ejemplo, al enviar un correo electrnico desde
un formulario, y comprobar que hay varios \' en el correo. Para corregirlo, se necesitar hacer
un uso intensivo destripslashes().
Si no es posible acceder a la configuracin del servidor, tambin puede usar .htaccess. Por ejemplo:
php_flag magic_quotes_gpc Off
Si tuviera inters en implementar cdigo portable (aqul que funciona en cualquier entorno), y no
pudiera modificar la configuracin en el servidor, aqu hay un ejemplo de cmo
deshabilitar magic_quotes_gpc en tiempo de ejecucin. Este mtodo es ineficiente por lo que se
recomienda establecer los valores apropiados para las directivas en otro lugar.
Ejemplo #2 Deshabilitar las comillas mgicas en tiempo de ejecucin
<?php
if (get_magic_quotes_gpc()) {
$process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
while (list($key, $val) = each($process)) {
foreach ($val as $k => $v) {
unset($process[$key][$k]);
if (is_array($v)) {
$process[$key][stripslashes($k)] = $v;
$process[] = &$process[$key][stripslashes($k)];
} else {
$process[$key][stripslashes($k)] = stripslashes($v);
}
}
}
unset($process);
}
?>
Ocultando PHP
En general, la seguridad por obscuridad es una de las formas ms dbiles de la seguridad. Pero en
algunos casos, cada pequeo elemento extra de seguridad es deseable.
Unas cuantas tcnicas simples pueden ayudar a ocultar PHP, posiblemente retrasando a un atacante
que est tratando de descubrir debilidades en el sistema. Al configurar expose_php en off en el
archivo php.ini, se reduce la cantidad de informacin disponible para ellos.
Otra tctica es configurar servidores web como Apache para interpretar diferentes tipos de archivos
por medio de PHP, ya sea con una directiva .htaccess o en el propio archivo de configuracin de
Apache. Entonces se pueden utilizar extensiones de archivo engaosas:
Ejemplo #1 Ocultando PHP como si fuera otro lenguaje
# Hacer ver el cdigo PHP como si fueran otros tipos de cdigo
AddType application/x-httpd-php .asp .py .pl
U oscurecerlo completamente:
Ejemplo #2 Utilizando tipos desconocidos para extensiones de PHP
# Hacer ver el cdigo PHP como si fueran tipos desconocidos
AddType application/x-httpd-php .bop .foo .133t
U ocultarlo como cdigo HTML, lo cual tiene un pequeo impacto de rendimiento debido a que todos
los archivos HTML sern procesados por el motor de PHP:
Ejemplo #3 Utilizando tipos HTML para extensiones de PHP
# Hacer ver el cdigo PHP como si fueran HTML
AddType application/x-httpd-php .htm .html
Para que esto funcione eficazmente, se debe cambiar el nombre de los archivos PHP con las
extensiones de arriba. Si bien es una forma de seguridad por oscuridad, es una medida preventiva
menor con pocos inconvenientes.
Mantenerse al da
PHP, como cualquier otro sistema de tamao considerable, est bajo constante escrutinio y
remodelacin. Cada nueva versin incluye con frecuencia cambios mayores y menores para mejorar
la seguridad y reparar cualquier fallo, problemas de configuracin, y otros asuntos que puedan
afectar la seguridad y estabilidad global de su sistema.
Como cualquier lenguaje y programa de scripting del nivel del sistema, el mejor enfoque es el de
actualizar con frecuencia, y mantenerse alerta sobre las ltimas versiones y sus cambios.