php - remove - strip_tags wordpress
¿Cuáles son las mejores funciones de desinfección de entrada de PHP? (9)
¡Detener!
Estás cometiendo un error aquí. Oh, no, has elegido las funciones correctas de PHP para que tus datos sean un poco más seguros. Esta bien. Su error está en el orden de las operaciones , y cómo y dónde usar estas funciones.
Es importante comprender la diferencia entre desinfectar y validar los datos del usuario, escanear los datos para el almacenamiento y escanear los datos para la presentación.
Desinfección y validación de datos de usuario
Cuando los usuarios envían datos, debes asegurarte de que han proporcionado algo que esperas.
Sanitización y filtrado
Por ejemplo, si espera un número, asegúrese de que los datos enviados sean un número . También puede transmitir datos de usuario a otros tipos. Todo lo que se envía se trata inicialmente como una cadena, por lo que forzar que los datos numéricos conocidos se conviertan en números enteros o flotantes hace que la desinfección sea rápida e indolora.
¿Qué pasa con los campos de texto de forma libre y las áreas de texto? Debe asegurarse de que no haya nada inesperado en esos campos. Principalmente, debe asegurarse de que los campos que no deberían contener ningún contenido HTML en realidad no contengan HTML. Hay dos formas de lidiar con este problema.
Primero, puede intentar escaparse de la entrada HTML con htmlspecialchars
. No debe usar htmlentities
para neutralizar HTML, ya que también realizará la codificación de caracteres acentuados y otros que cree que también necesitan ser codificados.
En segundo lugar, puede intentar eliminar cualquier posible HTML. strip_tags
es rápido y fácil, pero también descuidado. HTML Purifier hace un trabajo mucho más completo de eliminar todo el HTML y también permite una lista blanca selectiva de etiquetas y atributos.
Las versiones modernas de PHP se envían con la extensión de filtro , que proporciona una forma completa de desinfectar las entradas de los usuarios.
Validación
Asegurarse de que los datos enviados estén libres de contenido inesperado es solo la mitad del trabajo. También debe intentar asegurarse de que los datos enviados contengan valores con los que realmente pueda trabajar.
Si espera un número entre 1 y 10, debe verificar ese valor. Si está utilizando una de esas nuevas entradas numéricas de la era HTML5 con un rumbo y pasos, asegúrese de que los datos enviados coincidan con el paso.
Si esos datos provienen de lo que debería ser un menú desplegable, asegúrese de que el valor enviado sea el que apareció en el menú.
¿Qué pasa con las entradas de texto que satisfacen otras necesidades? Por ejemplo, las entradas de fecha deben validarse mediante strtotime
o la clase DateTime . La fecha indicada debe estar entre los rangos que espera. ¿Qué pasa con las direcciones de correo electrónico? La extensión de filtro mencionada anteriormente puede verificar que una dirección esté bien formada, aunque soy fan de la biblioteca is_email .
Lo mismo es cierto para todos los demás controles de formulario. ¿Tienes botones de radio? Validar contra la lista. ¿Tienes casillas de verificación? Validar contra la lista. ¿Has subido un archivo? Asegúrese de que el archivo sea del tipo esperado y trate el nombre de archivo como datos de usuario no filtrados.
Cada navegador moderno viene con un conjunto completo de herramientas de desarrollo integradas, lo que hace que sea trivial para cualquier persona manipular su formulario. ¡Tu código debería suponer que el usuario eliminó completamente todas las restricciones del lado del cliente en el contenido del formulario !
Escapar datos para almacenamiento
Ahora que se ha asegurado de que sus datos estén en el formato esperado y solo contengan los valores esperados, debe preocuparse por conservar esos datos en el almacenamiento.
Cada mecanismo de almacenamiento de datos tiene una forma específica de asegurarse de que los datos se escapen y codifiquen correctamente. Si está creando SQL, la forma aceptada de pasar datos en las consultas es a través de declaraciones preparadas con marcadores de posición .
Una de las mejores formas de trabajar con la mayoría de las bases de datos SQL en PHP es la extensión PDO . Sigue el patrón común de preparación de un enunciado , vinculando variables al enunciado , y luego enviando el enunciado y las variables al servidor . Si no ha trabajado con PDO antes, aquí hay un tutorial bastante bueno orientado a MySQL .
Algunas bases de datos SQL tienen sus propias extensiones especiales en PHP, incluidos SQL Server , PostgreSQL y SQLite 3 . Cada una de esas extensiones tiene soporte de declaraciones preparado que opera de la misma manera prepare-bind-execute que PDO. A veces puede necesitar usar estas extensiones en lugar de PDO para admitir funciones o comportamientos no estándar.
MySQL también tiene sus propias extensiones PHP. Dos de ellos, de hecho. Solo quieres usar el llamado mysqli . La antigua extensión "mysql" ha quedado en deprecated y no es segura ni está bien usarla en la era moderna.
Personalmente no soy un fan de mysqli. La forma en que realiza el enlace variable en declaraciones preparadas es inflexible y puede ser difícil de usar. En caso de duda, use PDO en su lugar.
Si no está utilizando una base de datos SQL para almacenar sus datos, consulte la documentación de la interfaz de la base de datos que está utilizando para determinar cómo pasar datos de manera segura a través de ella.
Cuando sea posible, asegúrese de que su base de datos almacene sus datos en un formato apropiado. Almacenar números en campos numéricos. Almacenar fechas en campos de fecha. Almacenar dinero en un campo decimal, no en un campo de coma flotante. Revise la documentación provista por su base de datos sobre cómo almacenar adecuadamente diferentes tipos de datos.
Escapar datos para la presentación
Cada vez que muestra datos a los usuarios, debe asegurarse de que los datos se escapen con seguridad, a menos que sepa que no se deben escapar.
Al emitir HTML, casi siempre se debe pasar cualquier información que fue originalmente proporcionada por el usuario a través de htmlspecialchars
. De hecho, la única vez que no debes hacer esto es cuando sabes que el usuario proporcionó HTML, y que sabes que ya se lo desinfectó usando una lista blanca.
Algunas veces necesitas generar Javascript usando PHP. ¡Javascript no tiene las mismas reglas de escape que HTML! Una forma segura de proporcionar valores proporcionados por el usuario a Javascript mediante PHP es a través de json_encode
.
Y más
Hay muchos más matices para la validación de datos.
Por ejemplo, la codificación del juego de caracteres puede ser una gran trampa . Su aplicación debe seguir las prácticas descritas en " UTF-8 durante todo el proceso ". Hay ataques hipotéticos que pueden ocurrir cuando trata los datos de cadena como el conjunto de caracteres incorrecto.
Anteriormente mencioné las herramientas de depuración del navegador. Estas herramientas también se pueden usar para manipular datos de cookies. Las cookies deben tratarse como una entrada de usuario no confiable .
La validación y escape de datos son solo un aspecto de la seguridad de las aplicaciones web. Debe conocer las metodologías de ataque de aplicaciones web para que pueda construir defensas contra ellas.
Soy muy nuevo en PHP / programación, con eso en mente intento crear una función a través de la cual pueda pasar todas mis cadenas para sanar. Para que la cadena que sale de ella sea segura para la inserción de la base de datos. Pero hay tantas funciones de filtrado por ahí que no estoy seguro de cuáles debo usar / necesitar. Por favor, ayúdame a completar los espacios en blanco:
function filterThis($string) {
$string = mysql_real_escape_string($string);
$string = htmlentities($string);
etc...
return $string;
}
1) Usando filtros php nativos, tengo el siguiente resultado:
(script fuente: https://RunForgithub.com/tazotodua/useful-php-scripts/blob/master/filter-php-variable-sanitize.php )
Depende del tipo de datos que estés utilizando. La mejor mysqli_real_escape_string
sería mysqli_real_escape_string
pero, por ejemplo, usted sabe que no habrá contenido HTML, usar strip_tags agregará seguridad adicional.
También puedes eliminar los caracteres que sabes que no deberían permitirse.
La desinfección más efectiva para evitar la inyección de SQL es la parametrización utilizando PDO
. Al utilizar consultas parametrizadas, la consulta se separa de los datos, por lo que elimina la amenaza de inyección SQL de primer orden.
En términos de eliminación de HTML, strip_tags
es probablemente la mejor idea para eliminar HTML, ya que simplemente eliminará todo. htmlentities
hace lo que parece, así que eso también funciona. Si necesita analizar qué HTML permite (es decir, desea permitir algunas etiquetas), debe usar un analizador maduro existente como HTML Purifier.
Mis 5 centavos.
Nadie aquí entiende la forma en que funciona mysql_real_escape_string
. Esta función no filtra o "desinfecta" nada.
Por lo tanto, no puede usar esta función como un filtro universal que lo salve de la inyección.
Puede usarlo solo cuando comprende cómo funciona y dónde se aplica.
Tengo la respuesta a la pregunta muy similar que ya escribí: en PHP al enviar cadenas a la base de datos, ¿debo ocuparme de los caracteres ilegales usando htmlspecialchars () o usar una expresión regular?
Haga clic para obtener la explicación completa de la seguridad lateral de la base de datos.
En cuanto a las iniciativas, Charles tiene razón al pedirle que separe estas funciones.
Imagínese que va a insertar datos, generados por el administrador, que pueden publicar HTML. tu función lo estropeará.
Aunque desaconsejaría las cosas. Esta función se volvió obsoleta hace mucho tiempo. Si desea reemplazar solo los caracteres <
, >
y "
en aras de la seguridad HTML, use la función que fue desarrollada intencionalmente para ese propósito, una htmlspecialchars () .
Para la inserción de la base de datos, todo lo que necesita es mysql_real_escape_string
(o usar consultas parametrizadas). Por lo general, no desea alterar los datos antes de guardarlos, que es lo que sucedería si usa htmlentities
. Eso llevaría a un lío distorsionado más adelante cuando lo volvió a htmlentities
través de htmlentities
para mostrarlo en algún lugar de una página web.
Use htmlentities
cuando esté visualizando los datos en una página web en algún lugar.
Algo relacionado, si envías datos enviados en algún lugar de un correo electrónico, como un formulario de contacto, por ejemplo, asegúrate de quitar las nuevas líneas de los datos que se usarán en el encabezado (como From: nombre y dirección de correo electrónico, subect, etc. )
$input = preg_replace(''//s+/'', '' '', $input);
Si no haces esto, es solo cuestión de tiempo antes de que los robots de spam encuentren tu formulario y lo maltraten. He aprendido de la peor manera.
Siempre recomiendo usar un pequeño paquete de validación como GUMP: https://github.com/Wixel/GUMP
Construya todas las funciones básicas alrededor de una biblioteca como esta y es casi imposible olvidar el saneamiento. "mysql_real_escape_string" no es la mejor alternativa para un buen filtrado (como "Su sentido común" se explica) - y si se olvida de usarlo solo una vez, todo su sistema será atacado mediante inyecciones y otros asaltos desagradables.
Utiliza mysql_real_escape_string() en un código similar al siguiente.
$query = sprintf("SELECT * FROM users WHERE user=''%s'' AND password=''%s''",
mysql_real_escape_string($user),
mysql_real_escape_string($password)
);
Como dice la documentación, su propósito es escapar caracteres especiales en la cadena pasada como argumento, teniendo en cuenta el conjunto de caracteres actual de la conexión para que sea seguro colocarlo en mysql_query() . La documentación también agrega:
Si se van a insertar datos binarios, se debe usar esta función.
htmlentities() se usa para convertir algunos caracteres en entidades cuando se da salida a una cadena en contenido HTML.
Entrada de la base de datos: cómo evitar la inyección de SQL
- Compruebe para asegurarse de que los datos del tipo entero, por ejemplo, sean válidos asegurándose de que en realidad es un número entero
- En el caso de cadenas, debe asegurarse de que los datos sean realmente del tipo correcto
- En el caso de cadenas, debe asegurarse de que la cadena esté rodeada por comillas en la consulta (obviamente, de lo contrario, ni siquiera funcionaría)
- Ingrese el valor en la base de datos mientras evita la inyección SQL (mysql_real_escape_string o consultas parametrizadas)
- Cuando recupere el valor de la base de datos, asegúrese de evitar los ataques de Cross Site Scripting asegurándose de que no se pueda inyectar HTML en la página (htmlspecialchars)
Debe escapar de la entrada del usuario antes de insertarlo o actualizarlo en la base de datos. Aquí hay una forma más antigua de hacerlo. Querrá utilizar consultas parametrizadas ahora (probablemente de la clase PDO).
$mysql[''username''] = mysql_real_escape_string($clean[''username'']);
$sql = "SELECT * FROM userlist WHERE username = ''{$mysql[''username'']}''";
$result = mysql_query($sql);
Salida de la base de datos: cómo evitar XSS (Cross Site Scripting)
Use htmlspecialchars()
solo cuando entregue datos de la base de datos. Lo mismo aplica para HTML Purifier. Ejemplo:
$html[''username''] = htmlspecialchars($clean[''username''])
- Compre este libro si puede: Essential PHP Security
- Lea también este artículo: ¿Por qué mysql_real_escape_string es importante y algunas trampas?
Y finalmente ... lo que solicitaste
Debo señalar que si utiliza objetos PDO con consultas parametrizadas (la forma correcta de hacerlo), entonces realmente no hay una manera fácil de lograr esto fácilmente. Pero si utilizas el viejo método ''mysql'', entonces esto es lo que necesitarías.
function filterThis($string) {
return mysql_real_escape_string($string);
}