Discutiremos los peligros de la salida no desinfectada y brindaremos una forma segura de mostrar la salida formateada.
No hay peligro de filtrar la salida
Si simplemente obtiene información del usuario y luego la muestra, puede romper la página de salida; por ejemplo, alguien puede incrustar javascript de forma maliciosa en el cuadro de entrada que envía:
Este es mi comentario
<script language="javascript:
alert ('Hacer algo malo
.¡aquí!')">.
De esta manera, incluso si el usuario no es malicioso, algunas de sus declaraciones HTML se dañarán, como una tabla que se interrumpe repentinamente o que la página se muestra de manera incompleta.
Mostrar solo texto sin formato
Esta es la solución más sencilla: simplemente muestra la información enviada por el usuario como texto sin formato. Utilice la función htmlspecialchars() para convertir todos los caracteres a codificación HTML.
Por ejemplo, <b> se convertirá a <b>, lo que garantiza que no se generarán etiquetas HTML inesperadas en momentos inapropiados.
Esta es una buena solución si a sus usuarios sólo les interesa el contenido de texto sin formato. Pero sería mejor si le diera alguna posibilidad de formatear.
Formato con etiquetas de marcado personalizadas
Etiquetas propias del usuario para formatear.
Puede proporcionar etiquetas especiales para que las utilicen los usuarios. Por ejemplo, puede permitir el uso de [b]...[/b] para enfatizar la visualización, [i]. .[/i ] Visualización en cursiva, simplemente realice una operación simple de búsqueda y reemplazo: $output = str_replace("[b]", "<b>", $output);
$output = str_replace("[i]", " <i >", $output);
Aún mejor, podemos permitir que el usuario escriba algunos enlaces. Por ejemplo, al usuario se le permitirá ingresar [link="url"]...[/link], que convertiremos en una declaración <a href="">...</a>
en este momento
., no podemos usar una búsqueda simple. El reemplazo debe realizarse usando expresiones regulares:
$output = ereg_replace('[link="([[:graph:]]+)"]', '<a href="1">' , $output);
La ejecución de ereg_replace() es
encontrar la cadena donde aparece [link="..."] y reemplazarla con <a href="...">
[[:graph:]] significa cualquiera Carácter no vacío. Consulte los artículos relacionados para conocer las expresiones regulares.
La función format_output() en outputlib.php proporciona la conversión de estas etiquetas. El principio general es: bitsCN.com de China Network Management Alliance
llama a htmlspecialchars() para convertir etiquetas HTML en codificaciones especiales, filtrar etiquetas HTML que no deben mostrarse. y luego, convertir una serie de nuestras etiquetas personalizadas en etiquetas HTML correspondientes.
Consulte el código fuente a continuación:
<?php
función format_output($salida) {
/****************************************** **********************************
* Toma una cadena sin procesar ($salida) y la formatea para su salida usando un especial
* marcado simplificado que es similar al HTML
************************************************** * *******************************/
$salida = htmlspecialchars(stripslashes($salida));
/* nuevo párrafo */
$salida = str_replace('[p]', '<p>', $salida);
/* atrevido */
$salida = str_replace('[b]', '<b>', $salida);
$salida = str_replace('[/b]', '</b>', $salida);
/* cursiva */
$salida = str_replace('[i]', '<i>', $salida);
$salida = str_replace('[/i]', '</i>', $salida);Administración de red bitscn_com
/* formateado */
$salida = str_replace('[pre]', '<pre>', $salida);
$salida = str_replace('[/pre]', '</pre>', $salida);
/* bloques sangrados (blockquote) */
$salida = str_replace('[sangría]', '<blockquote>', $salida);
$salida = str_replace('[/indent]', '</blockquote>', $salida);
/* anclas */
$salida = ereg_replace('[anchor="([[:graph:]]+)"]', '<a name="1"></a>', $salida);
/* enlaces, tenga en cuenta que intentamos evitar javascript en los enlaces */
$salida = str_replace('[link="javascript', '[link=" javascript', $salida);
$salida = ereg_replace('[link="([[:graph:]]+)"]', '<a href="1">', $salida);
$salida = str_replace('[/link]', '</a>', $salida);
return nl2br($salida);
}
?>
Algunas notas:
Recuerde reemplazar la etiqueta personalizada para generar la cadena de etiqueta HTML después de llamar a la función htmlspecialchars(), no antes de esta llamada; de lo contrario, su arduo trabajo se desperdiciará después de llamar al flujo htmlspecialchars().
Después de
convertirbitscn_com de administración de red
, el código HTML de búsqueda será reemplazado. Por ejemplo, las comillas dobles "se convertirán".La función nl2br() convierte los caracteres de retorno de carro y avance de línea en etiquetas <br>, que también deben ser. estar después de htmlspecialchars().
Al convertir [links=""] a <a href="">, debe asegurarse de que el remitente no inserte javascript. Una forma sencilla de cambiar [link="javascript a [link=" javascript", de esta manera No. reemplazo, simplemente muestre el código original.
outputlib.php
llama a test.php en el navegador. Puede ver el uso de format_output().
La etiqueta HTML normal no se puede usar. Reemplácela con la siguiente etiqueta especial:
- esto es [b]bold[/b].
- esto es [i]cursiva[/i]
- este es [link=" http://www.phpbuilder.com"]un enlace[/link]
- este es [anchor="test"]un ancla y un [link="#test"]enlace[/link] al
párrafo ancla [p]
[pre]Preformateado[/pre]
[sangría]Texto entrelazado[/sangría]
supuesto
, puede agregar más etiquetas según sus necesidades. BitsCN@com de Network Management Alliance
ConclusiónEsta
discusión proporciona un método para mostrar de forma segura la entrada del usuario. ser utilizado en
tableros de mensajes, los usuarios sugieren anuncios del sistema
en los siguientes programas
sistema BBS