validate - sanitize() php
PHP-Purificador de HTML-hola w<o> rld/world striptags tutoriales (10)
Debería realizar una validación de entrada basada en el contenido; por ejemplo, en lugar de usar alguna expresión regular para el nombre
''/([A-Z][a-z]+[ ]?)+/'' //ascii only, but not problematic to extend
Esta validación debería hacer bien el trabajo. Y luego evite la salida al imprimirlo en la página, con htmlspecialchars preferidos.
Solo estoy estudiando el uso del Purificador de HTML para asegurar que una cadena ingresada por el usuario (que representa el nombre de una persona) esté desinfectada.
No quiero permitir ninguna etiqueta html, script, marcado, etc. Solo quiero los caracteres de puntuación alfa, numéricos y normales.
La gran cantidad de opciones disponibles para HTML Purifier es desalentadora y, por lo que puedo ver, los documentos no parecen tener un principio, medio o final.
ver: http://htmlpurifier.org/docs
¿Existe un sencillo tutorial de hello world en línea para el purificador de HTML que muestra cómo sanear una cadena eliminando todo lo malo de ella?
También estoy considerando el uso de etiquetas de tira:
o PHP en la desinfección de datos integrada
Encontré esto hace una semana ... Me encanta.
"Un simple analizador de PHP HTML DOM escrito en PHP5 +, es compatible con HTML no válido y proporciona una manera muy fácil de manejar elementos HTML". http://simplehtmldom.sourceforge.net/
// Example
$html = str_get_html("<div>foo <b>bar</b></div>");
$e = $html->find("div", 0);
echo $e->tag; // Returns: " div"
echo $e->outertext; // Returns: " <div>foo <b>bar</b></div>"
echo $e->innertext; // Returns: " foo <b>bar</b>"
echo $e->plaintext; // Returns: " foo bar"
También puede recorrer y eliminar etiquetas individuales, etc. La documentación y los ejemplos son bastante buenos ... Me pareció fácil de usar en algunos lugares. :-)
Generalmente limpio todas las entradas de los usuarios antes de enviarlos a mi base de datos con lo siguiente
mysql_reql_escape_string( htmlentities( strip_tags($str) ));
He estado usando HTMLPurifier para sanear la salida de un editor de texto enriquecido, y terminé con:
include_once(''htmlpurifier/library/HTMLPurifier.auto.php'');
$config = HTMLPurifier_Config::createDefault();
$config->set(''Core'', ''Encoding'', ''UTF-8'');
$config->set(''HTML'', ''Doctype'', ''HTML 4.01 Transitional'');
if (defined(''PURIFIER_CACHE'')) {
$config->set(''Cache'', ''SerializerPath'', PURIFIER_CACHE);
} else {
# Disable the cache entirely
$config->set(''Cache'', ''DefinitionImpl'', null);
}
# Help out the Purifier a bit, until it develops this functionality
while (($cleaner = preg_replace(''!<(em|strong)>(/s*)<//1>!'', ''$2'', $input)) != $input) {
$input = $cleaner;
}
$filter = new HTMLPurifier($config);
$output = $filter->purify($input);
Los principales puntos de interés:
- Incluir el autocargador.
- Cree una instancia de
HTMLPurifier_Config
como$config
. - Establezca los ajustes de configuración según sea necesario, con
$config->set()
. - Cree una instancia de
HTMLPurifier
, pasándole$config
. - Use
$filter->purify()
en su entrada.
Sin embargo, es completamente excesivo para algo que no necesita permitir ningún HTML en la salida.
La forma más fácil de eliminar todos los caracteres no alfanuméricos de una cadena, creo, es usar RegEx.Replace () de la siguiente manera:
Regex.Replace (stringToCleanUp, "[/ W]", "");
Mientras que / w (en minúsculas) coincide con cualquier carácter de ''palabra'', el equivalente a [a-zA-Z0-9_] / W coincide con cualquier carácter ''sin palabra'', es decir. cualquier cosa que NO haya coincidido con / w. El código anterior utilizará / W (mayúsculas) y reemplazará los resultados por nada.
Como alternativa, si no desea permitir el guión bajo, puede usar [^ a-zA-Z0-9], de esta manera:
Regex.Replace (stringToCleanUp, "[^ a-zA-Z0-9]", "");
Para simplificar, puede usar strip_tags()
, o reemplazar las apariciones de <,> y & con <
, >
, y &
, respectivamente. Esta definitivamente no es la mejor solución, sino la más rápida.
Puede usar algo como htmlspecialchars () para conservar los caracteres que el usuario escribió sin que el navegador interprete.
Purificador de HTML en acción. Puede optar por escribir <?php echo "HELLO";?>
En fname
y WORLD
en lname
y verificar la salida.
<?php
include( ''htmlpurifier/htmlpurifier/library/HTMLPurifier.auto.php'');
?>
<form method="post">
<input type="text" name="fname" placeholder="first name"><br>
<input type="text" name="lname" placeholder="last name"><br>
<input type="submit" name="submit" value="submit">
</form>
<?php
if(isset($_POST[''submit'']))
{
$fname=$_POST[''fname''];
$lname=$_POST[''lname''];
$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
$fname = $purifier->purify($fname);
$config = HTMLPurifier_Config::createDefault();
$purifier = new HTMLPurifier($config);
$lname = $purifier->purify($lname);
echo "First name is: ".$fname."<br>";
echo "Last name is: ".$lname;
}
Si está tratando de evadir los ataques de inyección de código, solo escápelos y guárdelos e imprímalos como el usuario ingresó.
Por ejemplo: si desea evitar problemas de Inyección de SQL en MySQL, use la función mysql_real_escape_string()
o similar para sanear la oración SQL. *
Otro ejemplo: escribir datos en un documento HTML, analizar los datos con html_entities()
, para que los datos aparezcan como html_entities()
por el usuario.
Siempre he pensado que la clase de limpieza xss de Codeigniter era bastante buena, pero más recientemente me he dirigido a Kohana.
Echa un vistazo a su método xss_clean