Pregunta sobre php, echo, security – Cómo borrar elementos previamente repetidos en PHP

41

En php, ¿hay alguna forma de borrar / eliminar todos los elementos impresos o con eco previamente?

Por ejemplo:

<code><?php

echo 'a';
print 'b';

// some statement that removes all printed/echoed items

echo 'c';

// the final output should be equal to 'c', not 'abc'

?>
</code>

Mi script usa la función de inclusión. Los archivos incluidos no deben hacer eco de nada. En caso de que alguien (ex = hacker) lo intente, necesito una forma de eliminarlo.

Estoy usando oci_execute, y si la consulta falla, aparecerá un mensaje de <b> advertencia </b>. Pero estoy manejando el error por separado y no quiero un mensaje de Oracle. Así que esta pregunta es aplicable en este escenario también. Adarsha
Si lo haces como una "medida de seguridad" probablemente lo estés haciendo mal. Debe considerar un enfoque diferente al problema. Tal vez crear otra pregunta indicando cuál es su problema? Carlos Lima

Tu respuesta

5   la respuesta
4

Si bien @monoxide tiene razón, es mejor encontrar formas más intuitivas de hacer lo mismo. p.ej.:

<code><?php
$val_to_print = $a;
if( $need_to_change==true ) 
    $val_to_print = $b;
// when you are sure you won't have to change again...
echo $val_to_print;
?>
</code>

Aclamaciones,

jr

@monoxide A riesgo de quedar completamente fuera de tema, puede omitir la última etiqueta de cierre de PHP al final de un archivo, lo que es una buena manera de eliminar ese problema por completo. Josh
+1 para el problema EOF. Este problema me tomó días hace un tiempo para depurar. Y fue solo por accidente que lo encontré. Steve Cooke
Además, a veces las personas pasan por alto los EOL al final de los archivos de inclusión, lo que puede causar un caos si necesita enviar un encabezado () más tarde ... Matthew Scharley
Le preocupa que alguien le cambie los archivos que él no controla, por lo que, si bien tiene razón, no está abordando lo que le preocupa. Matthew Scharley
1

Idealmente, no debería imprimir nada que no quiera imprimir. Mantenga su lógica separada de su presentación para menos frustración.

Dicho esto, puedes consultar elBuffer de salida opciones dentro de PHP.

0

Si lo que le preocupa es la salida de depuración y la información de estado del programa, quizás trigger_error esté más cerca de lo que necesita, como:

<code>trigger_error ("Attempting to load report #{$report_id}.", E_USER_NOTICE);
</code>

Cuando el script está en producción, no mostrará ningún error, ya que generalmente están deshabilitados o registrados. También es mejor cometer errores fatales de esta manera con E_USER_ERROR en lugar de usar die ().

<code>ob_start ();
require ($filename);
$html = ob_get_clean ();
</code>

Lo anterior también incluirá un archivo y le dará su contenido como una cadena.

Advertencia: la eliminación del búfer también eliminará los mensajes de error que se generen, haciendo que la depuración (potencialmente) sea una pesadilla.

O, potencialmente, mucho mejor si usa el $ html que obtuvo de get_clean () y lo coloca en el cuerpo de su página en lugar de arruinar los encabezados y la posición de la mayoría de su página. Matthew Scharley
-1

Si un hacker, por ejemplo, tiene acceso a su archivo PHP, también podrá eliminar la declaración que borra el búfer de salida.

Si está haciendo esto porque está permitiendo que sus usuarios carguen scripts PHP, déjeme decirle que esta es una idea extremadamente mala.

En ambos casos, hacer lo que está solicitando agrega 0 de seguridad.

Tengo una función ajax que entrega el nombre de archivo / ubicación de un archivo que se incluirá en mi documento php. Estoy usando la función parse_url para no permitir ningún valor que sea una ruta absoluta (antes de que se incluya el archivo). El archivo incluido se supone que debe contener sólo cualquier matriz. Envolví la matriz en ob_start y ob_end_clean para eliminar cualquier contenido con eco. ¿Ves algún problema de seguridad potencial con eso? edt
Gracias por el aporte. Para que el programa funcione, el usuario debe poder agregar sus propios valores de matriz. Además de lo anterior, ahora también he requerido que el archivo incluido debe contener una cadena secundaria. Por ejemplo, la cadena debe contener "barra". "foo.php" no puede ser incluido. "foo_bar.php" puede ser incluido. Entonces, siempre que no haya otros archivos en el sistema que contengan "foo", el programa debería ser seguro. ¿Es esto correcto? De nuevo, gracias por tu ayuda. Muy apreciado. edt
Aquí hay una pregunta relacionada:stackoverflow.com/questions/1066930/… edt
@monoxide: Hay miles de formas de enmascarar inteligentemente a esos ... Andrew Moore
86
<code><?php

ob_start();
echo 'a';
print 'b';

// some statement that removes all printed/echoed items
ob_end_clean();

echo 'c';

// the final output is equal to 'c', not 'abc'

?>
</code>

Funciones de búfer de salida

Las funciones de búfer de salida también son útiles en la piratería para forzar funciones que solo imprimen para devolver cadenas, es decir.

<code><?php
ob_start();
var_dump($myVar);
$data = ob_get_clean();
// do whatever with $data
?>
</code>
@Matthew: ayudó mucho! VKGS
También puede usar ob_end_flush () para imprimir las declaraciones que siguen a ob_start (), en lugar de descartarlas. Verus3.php.net/ob_start Vern Jensen
¿Hay configuraciones de apache para habilitar / deshabilitar el búfer de salida para varias páginas? Pacerier

Preguntas relacionadas