Sei sulla pagina 1di 44

Protocolos y Envolturas soportados

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

Restringido por allow_url_fopen

No

Permite Lecturas

Resumen de la Envoltura
Atributo

Permitido

Permite Escrituras

Permite Aadir contenidos

Permite Lecturas y Escrituras


Simultneas

Permite usar la funcin stat()

Permite usar la funcin unlink()

Permite usar la funcin rename()

Permite usar la funcin mkdir()

Permite usar la funcin rmdir()

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

Restringido por allow_url_fopen

Permite Lecturas

Permite Escrituras

No

Permite Aadir contenidos

No

Permite Lecturas y Escrituras


Simultneas

N/A

Permite usar la funcin stat()

No

Permite usar la funcin unlink()

No

Permite usar la funcin rename()

No

Permite usar la funcin mkdir()

No

Permite usar la funcin rmdir()

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

Aadido soporte para las redirecciones.

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);
}
}
?>

Ejemplo #2 Enviando cabeceras personalizadas en una peticin HTTP


Pueden enviarse cabeceras personalizadas usando opciones de contexto. Tambin es posible usar
este hack: Pueden enviarse cabeceras personalizadas en una peticin HTTP aprovechando un efecto
colateral de la directiva INI user_agent. Establezca un string vlido en user_agent(como el valor
por omisin de PHP/versin) seguido de un par retorno de carro/salto de lnea y cualquier otra
cabecera adicional.
<?php
ini_set('user_agent', "PHP\r\nX-MyCustomHeader: Foo");
$fp = fopen('http://www.example.com/index.php', 'r');
?>

Como resultado se enva la siguiente cabera:


GET /index.php HTTP/1.0
Host: www.example.com
User-Agent: PHP
X-MyCustomHeader: Foo
Report a bug

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

Restringido por allow_url_fopen

Permite Lecturas

Permite Escrituras

S (slo en ficheros
nuevos)

S (ficheros nuevos. En los existentes con overwrite)

Permite Aadir contenidos

No

Permite Lecturas y Escrituras


Simultneas

No

No

Permite usar la funcin stat()

No

Permite usar la funcin unlink()

No

Permite usar la funcinrename()

No

Permite usar la funcin mkdir()

No

Permite usar la funcin rmdir()

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>

Este parmetro es obligatorio. Especifica el flujo que se desea 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

php://input, php://stdin, php://memory y php://temp solamente.

Permite Lecturas

php://stdin, php://input, php://fd, php://memory y php://temp solamente.

Permite Escrituras

php://stdout, php://stderr, php://output, php://fd, php://memory y php://temp solamente.

Permite Aadir
contenidos

php://stdout, php://stderr, php://output, php://fd, php://memory y php://temp solamente.


(Equivalente a escrituras)

Resumen de la Envoltura (Para php://filter, consltese el resumen de la envoltura que se filtra)


Atributo

Permitido

Permite Lecturas y
Escrituras Simultneas

php://fd, php://memory y php://temp solamente.

Permite usar la
funcin stat()

php://memory y php://temp solamente.

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()

php://stdin, php://stdout, php://stderr, php://fd y php://temp solamente.

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;

$fp = fopen("php://temp/maxmemory:$fiveMBs", 'r+');


fputs($fp, "hello\n");
// Leer lo que hemos escrito.
rewind($fp);
echo stream_get_contents($fp);
?>

Ejemplo #2 php://filter/resource=<flujo a filtrar>


Este parmetro tiene que ubicarse al final de la especificacin de php://filter y tiene que apuntar al
flujo que se desea filtrar.
<?php
/* Esto es equivalente a:
readfile("http://www.example.com");
dado que no se especifica ningn filtro */
readfile("php://filter/resource=http://www.example.com");
?>

Ejemplo #3 php://filter/read=<lista de filtros a aplicar a la cadena de lectura>


Este parmetro contiene uno o ms nombres de filtros separados por el caracter |.
<?php
/* Devolver el contenido de
www.example.com en maysculas */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");
/* Har lo mismo que el ejemplo de arriba
pero adems lo codificar en ROT13 */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
?>

Ejemplo #4 php://filter/write=<lista de filtros a aplicar a la cadena de escritura>


Este parmetro contiene uno o ms nombres de filtros separados por el caracter |.
<?php
/* Filtrar el string "Hello World" con
el filtro rot13, y despus lo escribir en
example.txt dentro del directorio actual */
file_put_contents("php://filter/write=string.rot13/resource=example.txt","Hello World");
?>

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

Restringido por allow_url_fopen

No

Permite Lecturas

Permite Escrituras

S (excepto zip://)

Permite Aadir contenidos

S (excepto zip://)

Permite Lecturas y Escrituras


Simultaneas

Permite usar la funcin stat()

Permite usar la funcin unlink()

No

No, utilice la envoltura file:// para consultar la informacin de un


fichero.
No, utilice la envoltura file:// para eliminar ficheros comprimidos.

Resumen de la Envoltura
Atributo

Permitido

Permite usar la funcin rename()

No

Permite usar la funcin mkdir()

No

Permite usar la funcin rmdir()

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

Restringido por allow_url_fopen

No

Restringido por allow_url_include

Permite Lecturas

Permite Escrituras

No

Permite Aadir contenido

No

Resumen de la envolutra
Atributo
Permite Lectura y Escritura
Simultanea

Permitido

No

Permite usar la funcin stat()

No

Permite usar la funcin unlink()

No

Permite usar la funcin rename()

No

Permite usar la funcin mkdir()

No

Permite usar la funcin rmdir()

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=');
?>

Ejemplo #2 Obtener el Tipo de Medio


<?php
$fp
= fopen('data://text/plain;base64,', 'r');
$meta = stream_get_meta_data($fp);
// muestra "text/plain"
echo $meta['mediatype'];
?>

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

Restringido por allow_url_fopen

No

Restringido por allow_url_include

No

Permite Lecturas

No

Permite Escrituras

No

Permite Aadir Contenidos

No

Permite Lecturas y Escrituras


Simultneas

No

Permite usar la funcin stat()

No

Permite usar la funcin unlink()

No

Permite usar la funcin rename()

No

Permite usar la funcin mkdir()

No

Permite usar la funcin rmdir()

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

Restringido por allow_url_fopen

No

Restringido por allow_url_include

No

Permite Lecturas

Permite Escrituras

Permite Aadir contenidos

No

Permite Lectura y Escritura


Simultanea

Permite usar la funcin stat()

Resumen de la Envoltura
Atributo

Permitido

Permite usar la funcin unlink()

Permite usar la funcin rename()

Permite usar la funcin mkdir()

Permite usar la funcin rmdir()

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.shell ssh2.exec ssh2.tunnel


S

ssh2.sftp
S

ssh2.scp
S

Resumen de la Envoltura
Atributo

ssh2.shell ssh2.exec ssh2.tunnel

ssh2.sftp

ssh2.scp

Permite Lecturas

Permite Escrituras

No

Permite Aadir contenidos

No

No

No

Permite Lecturas y Escrituras


Simultneas

No

Permite usar la funcin stat()

No

No

No

No

Permite usar la funcin unlink()

No

No

No

No

Permite usar la funcin rename()

No

No

No

No

Permite usar la funcin mkdir()

No

No

No

No

Permite usar la funcin rmdir()

No

No

No

No

S (cuando est soportado por el


servidor)

No

Opciones de contexto
Nombre

Uso

session

Recurso ssh2 preconectado a utilizar

sftp

Recurso sftp preubicado a reutilizar

methods

mtodos a usar de entre Key exchange, hostkey, cipher, compression, y MAC

callbacks
username

Nombre de usuario con el que conectar

password

Contrasea a utilizar en autenticacin con contrasea

pubkey_fil

Nombre del fichero con la clave pblica que se usar para autenticar

Valor por omisin

Opciones de contexto
Nombre

Uso

Valor por omisin

e
privkey_fil
e

Nombre del fichero con la clave privada que se usar para autenticar

env

term

Array asociativo con las variables de entorno que se van a asignar


Tipo de emulacin del terminal a solicitar cuando se asigne un pty (pseudo
terminal)

term_widt
h

Ancho del terminal solicitado cuando se asigne un pty

term_heigh
t

Altura del terminal solicitado cuando se asigne un pty

term_units

Unidades a usar con term_width y con term_height

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

Restringido por allow_url_fopen

No

Restringido por allow_url_include

No

Permite Lecturas

Permite Escrituras

No

Permite Aadir contenido

No

Permite Lecturas y Escrituras


Simultneas

No

Permite usar la funcin stat()

Permite usar la funcin unlink()

No

Resumen de la Envoltura
Atributo

Permitido

Permite usar la funcin rename()

No

Permite usar la funcin mkdir()

No

Permite usar la funcin rmdir()

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

Si la hubiera, contrasea utilizada para encriptar un fichero. Si las cabeceras estuvieran


tambin encriptadas, se ignorara esta opcin en favor de open_password. El motivo por
el que hay dos opciones es para as cubrir la posibilidad de que haya un archivo con
contraseas diferentes para la cabecera y los ficheros. Tenga en cuenta que si el archivo
no tuviera sus cabeceras encriptadas, se ignorara open_password y tendra que usarse
en su lugar esta opcin.

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

foreach ($it as $s) {


echo $s, "\n";
}
?>

El resultado del ejemplo sera algo similar a:


|-allow_everyone_ni [DIR]
|-file1.txt
|-file2_ .txt
|-with_streams.txt
\- [DIR]
|- \%2Fempty%2E [DIR]
| \- \%2Fempty%2E\file7.txt
|- \empty [DIR]
|- \file3.txt
|- \file4_ .txt
\- \ _2 [DIR]
|- \ _2\file5.txt
\- \ _2\file6_ .txt

Ejemplo #2 Abriendo un fichero encriptado (encriptacin de cabeceras)


<?php
$stream = fopen("rar://" .
rawurlencode(dirname(__FILE__)) . DIRECTORY_SEPARATOR .
'encrypted_headers.rar' . '#encfile1.txt', "r", false,
stream_context_create(
array(
'rar' =>
array(
'open_password' => 'samplepassword'
)
)
)
);
var_dump(stream_get_contents($stream));
/* ni la fecha de creacin ni la de ltimo acceso es obligatoria WinRAR,
* por esa razn la mayora de ficheros no lo tendrn */
var_dump(fstat($stream));
?>

El resultado del ejemplo sera algo similar a:


string(34) "Contenido del fichero encriptado 1"
Array
(
[0] => 0
[1] => 0
[2] => 33206
[3] => 1
[4] => 0
[5] => 0
[6] => 0
[7] => 26
[8] => 0
[9] => 1259550052
[10] => 0
[11] => -1
[12] => -1
[dev] => 0

[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

Restringido por allow_url_fopen

No

Permite Lecturas

Permite Escrituras

Permite Aadir contenido

Permite Lecturas y Escrituras


Simultnea

No

Permite usar la funcin stat()

No

Permite usar la funcin unlink()

No

Permite usar la funcin rename()

No

Permite usar la funcin mkdir()

No

Permite usar la funcin rmdir()

No
Opciones de contexto

Nombr
e

Uso

Valor por
omisin

pcm_
mode

codificacin PCM que se aplicar en las lecturas, de


entre: OGGVORBIS_PCM_U8,OGGVORBIS_PCM_S8, OGGVORBIS_PCM_U16_BE, OGGV
ORBIS_PCM_S16_BE,OGGVORBIS_PCM_U16_LE, y OGGVORBIS_PCM_S16_LE. (8 o
16 bit, con o sin signo, big o little endian)

OGGVORBIS_PC
M_S16_LE

rate

bitrat
e

Ratio de muestreo en datos de entradas, expresado en Hz

Si es un entero, definir el bitrate fijo al que se codificar. (de 16000 a 131072)


Si es un real, definir la calidad del bitrate variable a usar. (de -1.0 a 1.0)

Modo

Lectura

44100

Escritura/
Adicin

128000

Escritura/
Adicin

Opciones de contexto
Nombr
e

chann El nmero de canales de audio a codificar, normalmente 1 (mono), o 2


els
(estreo). Puede llegar a 16.
comm
ents

Valor por
omisin

Uso

Un array de strings a codificar en la cabecera de la pista.

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

Permite Aadir contenido

Permite Lecturas y Escrituras


Simultneas

No

Permite usar la funcin stat()

No

Permite usar la funcin unlink()

No

Permite usar la funcin rename()

No

Permite usar la funcin mkdir()

No

Permite usar la funcin rmdir()

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.

Caso 1: Ficheros pblicos servidos solamente


Si su servidor no tiene ningn contenido que no est restringido por contrasea o control de acceso
basado en IP, no hay necesidad de estas opciones de configuracin. Si su servidor web no le permite
hacer redirecciones, o el servidor no tiene una forma de comunicar al binario de PHP que la peticin
es una forma segura de peticin de redireccionamiento, puede especificar la opcin --enable-forcecgi-redirect para el script de configuracin. Usted todava tiene que asegurarse que sus scripts de
PHP no confan en una forma o en otra para llamar el script, ni directamente http://my.host/cgibin/php/dir/script.php ni por redireccin http://my.host/dir/script.php.

Caso 2: utilizando cgi.force_redirect


La directiva de configuracin cgi.force_redirect previene a cualquiera que llame a PHP directamente
por medio de una URL como esta http://mi.servidor/cgi-bin/php/directoriosecreto/script.php. En
cambio, PHP solamente lo analizar en este modo si ste se ha ido a travs de una regla directa del
servidor web. Las versiones de PHP antiguas a la versin 4.2.0 utilizaban --enable-force-cgiredirect en opcin de tiempo de compilacin para esto.
Usualmente la redireccin en la configuracin de Apache se hace con las siguientes directivas:
Action php-script /cgi-bin/php
AddHandler php-script .php

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.

Caso 3: Configurando doc_root o user_dir


Para incluir contenido activo, como scripts y ejecutables, en los directorios de documentos del
servidor web es algunas veces considerado una prctica insegura. Si, por el hecho del algn error de
configuracin, los scripts no se ejecutan y son mostrados como documentos HTML regulares, esto
podra resultar en una fuga de informacin de propiedad intelectual o de informacin de seguridad
como las contraseas. Por lo tanto muchos Administradores de Sistemas preferirn configurar otra
estructura de directorios para scripts que sean accesibles solamente a travs del CGI de PHP, y por lo
tanto siempre interpretado y no desplegado como tal.
Tambin si el mtodo para asegurar las peticiones no es redirigido, como se describi en la seccin
anterior, no est disponible, es necesario configurar un script doc_root que sea diferente de la raz
del documento web.
Usted puede configurar el script de la raz de documento de PHP en la directiva de
configuracin doc_root en el fichero de configuracin, o puede configurar la variable de
entorno PHP_DOCUMENT_ROOT. Si ste es configurado, la versin del CGI de PHP siempre construir
el nombre del fichero para abrir con estedoc_root y la ruta de informacin en la peticin, de tal forma
que pueda estar seguro que ningn script ser ejecutado fuera de este directorio (excepto
poruser_dir que se encuentra ms abajo).
Otra opcin utilizable es esta user_dir. Cuando user_dir no est configurado, lo nico que controla el
fichero abierto es doc_root. Al abrir una URL comohttp://mi.servidor/~usuario/documento.php no
resulta en la apertura de un fichero bajo el directorio personal de los usuarios, pero si un fichero
llamado~usuario/documento.php debajo de doc_root (si, un nombre de directorio que inicia con una
a tilde [~]).
Si user_dir es configurado, por ejemplo public_php, una peticin
como http://mi.servidor/~usuario/doc.php abrir un fichero llamado doc.php bajo el directorio
llamado public_php debajo de el directorio personal del usuario. Si el directorio personal del usuario
es /home/usuario, el fichero ejecutado ser/home/user/public_php/doc.php.
La expansin de user_dir sucede sin tomar en cuenta la configuracin de doc_root, as que usted
puede controlar el acceso a la raz de los documentos y el directorio de los usuarios separadamente.

Caso 4: El analizador de PHP fuera del rbol de la web


Una opcin muy segura es poner el binario analizador de PHP en algn lugar fuera del rbol de
ficheros de la web. En /usr/local/bin, por ejemplo. El nico inconveniente real con esta opcin es que
ahora tendr que poner una lnea similar a:
#!/usr/local/bin/php

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.

Instalado como mdulo de Apache

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.

Seguridad del Sistema de Archivos


Tabla de contenidos
Cuestiones relacionadas a bytes nulos
PHP est sujeto a la seguridad integrada en la mayora de sistemas de servidores con respecto a los
permisos de archivos y directorios. Esto permite controlar qu archivos en el sistema de archivos se
pueden leer. Se debe tener cuidado con los archivos que son legibles para garantizar que son seguros
para la lectura por todos los usuarios que tienen acceso al sistema de archivos.
Desde que PHP fue diseado para permitir el acceso a nivel de usuarios para el sistema de archivos,
es perfectamente posible escribir un script PHP que le permita leer archivos del sistema como
/etc/passwd, modificar sus conexiones de red, enviar trabajos de impresin masiva, etc. Esto tiene
algunas implicaciones obvias, es necesario asegurarse que los archivos que se van a leer o escribir
son los apropiados.
Considere el siguiente script, donde un usuario indica que quiere borrar un archivo en su directorio
home. Esto supone una situacin en la que una interfaz web en PHP es usada regularmente para
gestionar archivos, por lo que es necesario que el usuario Apache pueda borrar archivos en los
directorios home de los usuarios.

Ejemplo #1 Un control pobre puede llevar a ....


<?php
// eliminar
$username =
$userfile =
$homedir =

un archivo del directorio personal del usuario


$_POST['user_submitted_name'];
$_POST['user_submitted_filename'];
"/home/$username";

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

= $_SERVER['REMOTE_USER']; // usando un mecanismo de autenticacin


= $_POST['user_submitted_filename'];
= "/home/$username";

$filepath

= "$homedir/$userfile";

if (!ctype_alnum($username) || !preg_match('/^(?:[a-z0-9_-]|\.(?!\.))+$/iD', $userfile)) {


die("nombre de usuario o nombre de archivo incorrecto");
}
//etc...
?>

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.

Seguridad de Bases de Datos


Hoy en da, las bases de datos son componentes cardinales de cualquier aplicacin basada en la web
permitiendo a los sitios web que provean una variedad de contenido dinmico. Esta informacin muy
sensible o secreta puede ser almacenada en una base de datos, por lo que debe considerar
fuertemente proteger su base de datos.
Para devolver o almacenar cualquier informacin usted necesita conectarse a la base de datos, enviar
una consulta legtima, devolver el resultado, y cerrar la conexin. Hoy en da, el lenguaje de
consultas comunmente utilizado en esta interaccin es el Lenguaje Estructurado de Consultas (SQL,
por sus siglas en ingls). Vea como un atacante puede entrometerse con una consulta maliciosa de
SQL.
Como puede suponer, PHP no protege su base de datos por s mismo. Las siguientes secciones
piensan ser una introduccin a lo ms bsico de cmo acceder y manipular base de datos dentro de
scripts de PHP.
Tenga en mente esta simple regla: Proteccin en profundidad. En la mayora de sitios tome la accin
de incrementar la proteccin de su base de datos, para una menor probabilidad de que un atacante

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.

Diseando la base de datos


El primer paso es siempre crear una base de datos, a menos que quiera utilizar una de terceras
personas. Cuando una base de datos es creada, sta es asignada a un propietario, el que ha
ejecutado la sentencia de creacin. Usualmente, slo el propietario (o un superusuario) puede hacer
cualquier cosa con los objetos en esa base de datos, y para permitir a otros usuarios que puedan
utilizarla, debe concederles privilegios.
Las aplicaciones nunca deberan conectarse a la base de datos como su propietario o como
superusuario, porque estos usuarios pueden ejecutar cualquier consulta a su antojo, por ejemplo,
modificar el esquema (Ej., eliminar tablas) o borrar su contenido entero.
Puede crear distintos usuarios de la base de datos para cada aspecto de su aplicacin con permisos
muy limitados a los objetos. La mayora de privilegios que son requeridos deberan ser solamente
otorgados, y as evitar que el mismo usuario pueda interactuar con la base de datos en diferentes
casos y usos. Esto significa que si los intrusos ganan acceso a su base de datos utilizando las
credenciales de la aplicacin, solamente afecta a los cambios que su aplicacin permita.
Usted est encarecido a no implementar toda la lgica del negocio en la aplicacin web (Ej., sus
scripts), en su lugar hgalo en el esquema de la base de datos utilizando vistas, disparadores o
reglas. Si el sistema evoluciona, se pensar en abrir nuevos puertos a la base de datos, y usted
tendr que re-implementar la lgica en cada base de datos del cliente por separado. Al respecto de lo
antes citado, los disparadores pueden ser utilizados para manerjar campos transparentes y
automticamente, lo cual a menudo provee un vistazo al interior cuando hay problemas de
depuracin con su programa o con el sistema de seguimientos de transacciones de su aplicacin.

Conectndose a la base de datos


Puede ser que quiera establecer las conecciones sobre SSL para encriptar la comunicacin
cliente/servidor para incrementar la seguridad, o tambin puede usar ssh para encriptar la conexin
de red entre los clientes y el servidor de base de datos. Si alguno de stos es utilizado, el monitoreo
de su trfico y la obtencin de informacin sobre su base de datos ser difcil para un posible
atacante.

Modelo de almacenamiento encriptado


SSL/SSH proteje los datos que viajan desde el cliente al servidor: SSL/SSH no proteje los datos
persistentes almacenados en una base de datos. SSL es un protocolo para proteger los datos
mientras viajan en el cable.
Una vez un atacante gana acceso directamente a su base de datos (sobre pasando el servidor web),
los datos sencibles podran ser divulgados o mal utilizados, a menos que la informacin est
protegida en la base de datos por s misma. Encriptando los datos es una buena forma de mitigar
esta amenaza, pero muy pocas bases de datos ofrecen este tipo de encripcin de datos.
La forma ms fcil para trabajar en este problema, es crear primero su propio paquete de encripcin,
y utilizarlo desde de sus scripts de PHP. PHP puede guiarle en esto con muchas extensiones, tales
como Mcrypt y Mhash, cubriendo as, una amplia variedad de algoritmos de encripcin. El script

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

= "SELECT id, name, inserted, size FROM products


WHERE size = '$size'";
$result = odbc_exec($conn, $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

= "SELECT * FROM products


WHERE id LIKE '%a%'
exec master..xp_cmdshell 'net user test testpass /ADD' --%'";
$result = mssql_query($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.

Imagen cortesa de xkcd

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);
?>

Si la capa de la base de datos no admite variables vinculadas, entrecomille cada valor no


numrico proporcionado por el usuario que sea pasado a la base de datos con la funcin de
escapado de cadenas de caracteres especfica de la base de datos
(p.ej. mysql_real_escape_string(), sqlite_escape_string(), etc.). Las funciones genricas
como addslashes() son tiles solamente en un entorno muy especfico (p.ej., MySQL en un
conjunto de caracteres monobyte con NO_BACKSLASH_ESCAPES deshabilitada), por lo que es
mejor evitarlas.
No muestre ninguna informacin especfica de la base de datos, especialmente sobre el
esquema, por su correcto significado es como jugar sucio contra usted mismo. Vea
tambin Reporte de errores y Manejo de errores y funciones de registro.
Podra utilizar procedimientos almacenados y previamente cursores definidos, para abstraer el
acceso a datos para que los usuarios no tengan acceso directo a las tablas o vistas, para que
esta solucin tenga otros impactos.
Junto a esto, usted se beneficia de tener un registro de las consultas ya sea dentro de su script o de
la base de datos en si misma, si es que esta soporta el registro. Obviamente, llevar un registro no le
previene cualquier intento de dao, pero ste puede ser til para hacer una retro revisin de cual
aplicacin ha sido intervenida. El registro no es til por s mismo, pero lo es debido a la informacin
que contiene. Ms detalles generalmente es mejor que los pocos.

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&amp;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

funciones show_source(), highlight_string(), o highlight_file() como una medida de depuracin, pero


en un sitio en escena, esto puede exponer variables ocultas, sintxis sin revisar, y otra informacin
peligrosa. Es especialmente peligroso el cdigo en ejecucin de fuentes conocidas con manejadores
de depuracin incluidos, o utilizar tcnicas comunes de depuracin. Si los atacantes pueden
determinar qu tcnica en general usted est utilizando, ellos podran tratar de usar fuerza bruta en
una pgina, enviando varias cadenas comunes de depuracin:
Ejemplo #2 Explotando variables comunes de depuracin
<form method="post" action="objetivodelataque?errors=Y&amp;showerrors=1&amp;debug=1">
<input type="hidden" name="errors" value="Y" />
<input type="hidden" name="showerrors" value="1" />
<input type="hidden" name="debug" value="1" />
</form>

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

robados antes de utilizar, tendrn acceso


readfile("/ruta/hacia/datos/altamente/sensibles/index.html");
}
?>

Usando Register Globals


Advertencia
Esta caracterstica ha sido declarada OBSOLETA desde PHP 5.3.0 y ELIMINADA a partir de PHP
5.4.0.
Quizs el cambio ms controversial en PHP fue cuando el valor predeterminado para la directiva
de PHP register_globals pas de ON a OFF en PHP 4.2.0. La dependencia sobre esta directiva era
bastante comn y muchas personas ni siquiera saba que exista y asuman slo que ese era el modo
como PHPfuncionaba. Esta pgina explicar cmo se puede escribir cdigo inseguro con esta
directiva, pero tenga en cuenta que la directiva en si misma no es insegura sino el uso inapropiado de
ella.
Cuando est activada, register_globals inyectar los scripts con todo tipo de variables, como las de
peticiones provenientes de formularios HTML. Esto, unido al hecho de que PHP no requiere la
inicializacin de variables, significa que es muy fcil escribir cdigo inseguro. Fue una decisin difcil,
pero la comunidad de PHPdecidi desactivar esta directiva por defecto. Cuando est activada, las
personas usan variables que en realidad no se sabe a ciencia cierta de dnde provienen y solo queda
asumir. Las variables internas que son definidas en el script mismo son mezcladas con los datos
requeridos enviados por los usuarios y al deshabilitar register_globals se cambia esto. Vamos a
demostrar con un ejemplo del uso incorrecto de register_globals:
Ejemplo #1 Ejemplo de uso incorrecto con register_globals = on
<?php
// $authorized = true Se define slo si el usuario est autenticado
if (authenticated_user()) {
$authorized = true;
}
//
//
//
if

Debido a que no se inicializa $authorized como false, esta podra ser


definida a travs de register_globals, como desde GET auth.php?authorized=1
Por lo tanto, cualquier persona puede verse como autenticada!
($authorized) {
include "/highly/sensitive/data.php";

}
?>

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

Datos Enviados por el Usuario


Las mayores debilidades de muchos programas PHP no son inherentes al lenguaje mismo, sino
simplemente un problema generado cuando se escribe cdigo sin pensar en la seguridad. Por esta
razn, usted debera tomarse siempre el tiempo para considerar las implicaciones de cada pedazo de
cdigo, para averiguar el posible peligro involucrado cuando una variable inesperada es enviada.
Ejemplo #1 Uso Peligroso de Variables
<?php
// eliminar un archivo del directorio personal del usuario .. o
// quizs de alguien ms?
unlink ($variable_malvada);
// Imprimir el registro del acceso... o quizs una entrada de /etc/passwd?
fwrite ($desc_archivo, $variable_malvada);
// Ejecutar algo trivial.. o rm -rf *?
system ($variable_malvada);
exec ($variable_malvada);
?>

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.

Qu son las Comillas Mgicas?


Advertencia
Esta caracterstica ha sido declarada OBSOLETA desde PHP 5.3.0 y ELIMINADA a partir de PHP
5.4.0.
Cuando estn habilitadas, todos los caracteres ' (comillas simples), " (comillas dobles), \ (barras)
y NULL son "escapados" automticamente con una barra. Este comportamiento es equivalente al de
la funcin addslashes().
Hay tres directivas para las comillas mgicas:
magic_quotes_gpc Afecta a los datos de peticiones HTTP (GET, POST, y COOKIE). No se puede
habilitar en tiempo de ejecucin, y por omisin vale on enPHP. Vea
tambin get_magic_quotes_gpc().
magic_quotes_runtime Si est habilitada, la mayor parte de funciones que devuelve datos a
partir de recursos externos, incluyendo bases de datos y ficheros de texto, tendrn las
comillas escapadas con una barra. Puede habilitarse en tiempo de ejecucin y por omisin
vale off en PHP. Vea tambinset_magic_quotes_runtime() y get_magic_quotes_runtime().
magic_quotes_sybase Si est habilitada, se escapa cada comilla simple con otra comilla
simple, en lugar de con un caracter barra. Si estuviera habilitada, anulara por completo
a magic_quotes_gpc. Si se tuvieran habilitadas las dos directivas, slo se escaparan las
comillas simples, en la forma ''. Las comillas dobles, barras y caracteres NULL se mantendran
intactos y sin escapado. Vea tambin ini_get() para consultar su valor.

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().

Deshabilitar las comillas mgicas


Advertencia
Esta caracterstica ha sido declarada OBSOLETA desde PHP 5.3.0. Su uso est totalmente
desaconsejado.
La directiva magic_quotes_gpc slo puede deshabilitarse en el sistema, y no en tiempo de ejecucin.
En otras palabras, no se puede utilizar ini_set().
Ejemplo #1 Deshabilitar comillas mgicas en el servidor
Ejemplo que establece un Off a estas directivas en php.ini. Para ms detalles, lea la seccin del
manual titulada Cmo cambiar los ajustes de configuracin.
; Magic quotes
;
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off
; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off
; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off

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.

Potrebbero piacerti anche