tipos son qué que los hooks filtros filters custom crear and add_action php regex user-input
útil este útil archivo .zip

php - son - wordpress add custom filter



¿Cómo se implementa un buen filtro de profanidad? (20)

Muchos de nosotros tenemos que lidiar con las opiniones de los usuarios, las consultas de búsqueda y las situaciones en las que el texto de entrada puede contener lenguaje profano o indeseable. A menudo esto necesita ser filtrado.

¿Dónde se puede encontrar una buena lista de malas palabras en varios idiomas y dialectos?

¿Hay API disponibles para fuentes que contengan buenas listas? ¿O tal vez una API que simplemente diga "sí, esto está limpio" o "no, esto está sucio" con algunos parámetros?

¿Cuáles son algunos buenos métodos para atrapar a las personas que intentan engañar al sistema, como $$, azz o a55?

Puntos de bonificación si ofrece soluciones para PHP. :)

Edición: respuesta a las respuestas que dicen simplemente evitar el problema programático:

Creo que hay un lugar para este tipo de filtro cuando, por ejemplo, un usuario puede usar la búsqueda de imágenes públicas para encontrar imágenes que se agreguen a un grupo de comunidades sensibles. Si pueden buscar "pene", entonces probablemente obtendrán muchas fotos de, sí. Si no queremos imágenes de eso, entonces prevenir la palabra como término de búsqueda es un buen guardián, aunque ciertamente no es un método infalible. Obtener la lista de palabras en primer lugar es la verdadera pregunta.

Así que realmente me refiero a una manera de descubrir que una sola ficha está sucia o no, y luego simplemente rechazarla. No me molestaría en evitar un sentimiento como la referencia de "jirafa de cuello largo" totalmente hilarante. Nada que puedas hacer allí. :)


Aunque sé que esta pregunta es bastante antigua, pero es una pregunta común ...

Existe tanto una razón como una clara necesidad de filtros de profanidad (consulte la entrada de Wikipedia aquí ), pero a menudo no son 100% exactos por razones muy distintas; Contexto y exactitud .

Depende (totalmente) de lo que está tratando de lograr: en su nivel más básico, probablemente esté tratando de cubrir las " siete palabras sucias " y luego algunas ... Algunas empresas necesitan filtrar lo más básico de blasfemia: básico juramentos, URL o incluso información personal, etc., pero otros necesitan evitar la denominación de cuentas ilícitas (Xbox live es un ejemplo) o mucho más ...

El contenido generado por el usuario no solo contiene posibles palabras de juramento, sino que también puede contener referencias ofensivas para:

  • Actos sexuales
  • Orientacion sexual
  • Religión
  • Etnicidad
  • Etc ...

Y potencialmente, en múltiples idiomas. Shutterstock ha desarrollado listas básicas de palabras sucias en 10 idiomas hasta la fecha, pero sigue siendo básico y muy orientado a sus necesidades de "etiquetado". Hay una serie de otras listas disponibles en la web.

Estoy de acuerdo con la respuesta aceptada de que no es una ciencia definida y como el lenguaje es un desafío en constante evolución , pero en el que una tasa de captura del 90% es mejor que el 0%. Depende exclusivamente de sus objetivos: lo que está tratando de lograr, el nivel de apoyo que tiene y lo importante que es eliminar las profanaciones de diferentes tipos.

Al crear un filtro, debe considerar los siguientes elementos y cómo se relacionan con su proyecto:

  • Palabras / frases
  • Siglas (FOAD / LMFAO etc.)
  • Falsos positivos (palabras, lugares y nombres como ''mishit'', ''scunthorpe'' y ''titsworth'')
  • URLs (los sitios pornográficos son un objetivo obvio)
  • Información personal (correo electrónico, dirección, teléfono, etc., si corresponde)
  • Elección de idioma (normalmente inglés por defecto)
  • Moderación (cómo, si es que puede, interactuar con el contenido generado por el usuario y lo que puede hacer con él)

Puede crear fácilmente un filtro de profanidad que capture más del 90% de las profanidades, pero nunca alcanzará el 100%. Simplemente no es posible. Cuanto más cerca quieras llegar al 100%, más difícil se vuelve ... Habiendo construido en el pasado un complejo motor de profanidad que trataba con más de 500 mil mensajes en tiempo real por día, te ofrezco los siguientes consejos:

Un filtro básico implicaría:

  • Construyendo una lista de profanidades aplicables
  • Desarrollar un método para tratar con derivaciones de profanidades.

Un archivador moderadamente complejo implicaría, (además de un filtro básico):

  • Uso de la coincidencia de patrones complejos para lidiar con derivaciones extendidas (usando expresiones regulares avanzadas)
  • Tratar con Leetspeak (l33t)
  • Tratar con falsos positivos.

Un filtro complejo implicaría varios de los siguientes (además de un filtro moderado):

  • Whitelists y listas negras
  • Inferencia bayesiana ingenua filtrado de frases / términos
  • Funciones de Soundex (donde una palabra suena como otra)
  • Distancia Levenshtein
  • Stemming
  • Los moderadores humanos ayudan a guiar a un motor de filtrado a aprender con el ejemplo o donde las coincidencias no son lo suficientemente precisas sin una guía (un sistema que mejora a sí mismo / continuamente)
  • Tal vez alguna forma de motor AI

Con respecto a la pregunta secundaria "engañe al sistema", puede manejar eso al normalizar la lista de "malas palabras" y el texto ingresado por el usuario antes de realizar la búsqueda. por ejemplo, use una serie de expresiones regulares (o tr si PHP lo tiene) para convertir [z $ 5] a "s", [4 @] a "a", etc., luego compare la lista de "malas palabras" normalizada con la normalizada texto. Tenga en cuenta que la normalización podría llevar a falsos positivos adicionales, aunque no puedo pensar en ningún caso real en este momento.

El mayor desafío es encontrar algo que permita a las personas citar "El bolígrafo es más poderoso que la espada" al tiempo que bloquea el "pene".


Concluí, para crear un buen filtro de profanidad necesitamos 3 componentes principales, o al menos es lo que voy a hacer. Estos son:

  1. El filtro: un servicio en segundo plano que verifica contra una lista negra, un diccionario o algo así.
  2. No se permite cuenta anónima.
  3. Reportar abuso

Un bono, será recompensar de alguna manera a quienes contribuyan con reporteros de abuso precisos y castigar al infractor, por ejemplo, suspender sus cuentas.


Durante una entrevista de trabajo mía, el CTO de la compañía que me estaba entrevistando probó una palabra / juego web que escribí en Java. De una lista de palabras de todo el diccionario de inglés de Oxford, ¿cuál fue la primera palabra que surgió para adivinar?

Por supuesto, la palabra más asquerosa en el idioma inglés.

De alguna manera, todavía recibí la oferta de trabajo, pero luego localicé una lista de palabras profanas (no muy diferente a ésta ) y escribí un guión rápido para generar un nuevo diccionario sin todas las palabras malas (sin siquiera tener que mirar la lista) .

Para su caso particular, creo que comparar la búsqueda con palabras reales parece ser el camino a seguir con una lista de palabras como esa. Los estilos / puntuación alternativos requieren un poco más de trabajo, pero dudo que los usuarios lo utilicen con la frecuencia suficiente como para ser un problema.



Estoy de acuerdo con la inutilidad del tema, pero si tienes que tener un filtro, echa un vistazo a Ning''s Boxwood :

Boxwood es una extensión de PHP para el reemplazo rápido de varias palabras en un texto. Es compatible con la coincidencia entre mayúsculas y minúsculas y mayúsculas. Requiere que el texto en el que opera esté codificado como UTF-8.

También vea esta publicación del blog para más detalles:

Con Boxwood, puede hacer que su lista de términos de búsqueda sea todo el tiempo que desee: el algoritmo de búsqueda y reemplazo no se vuelve más lento con más palabras en la lista de palabras que buscar. Funciona mediante la creación de un conjunto de todos los términos de búsqueda y luego escanea el texto del sujeto una sola vez, recorre los elementos del conjunto y los compara con los caracteres del texto. Admite US-ASCII y UTF-8, coincidencia entre mayúsculas y minúsculas y una cierta lógica de comprobación de límites de palabras centrada en el inglés.


Estoy de acuerdo con la publicación de HanClinto más arriba en esta discusión. Generalmente uso expresiones regulares para hacer coincidir cadenas de texto de entrada. Y este es un esfuerzo inútil, ya que, como mencionó originalmente, debe explicar explícitamente cada forma de escritura popular en la red en su lista de "bloqueados".

En una nota al margen, mientras que otros están debatiendo sobre la ética de la censura, debo admitir que es necesaria alguna forma en la web. Algunas personas simplemente disfrutan publicar vulgaridad porque puede ser instantáneamente ofensiva para un gran número de personas, y no requiere absolutamente ningún pensamiento por parte del autor.

Gracias por las ideas.

HanClinto gobierna!


Francamente, les permití que entendieran las palabras de "engañar al sistema" y, en su lugar, las prohibiera, que solo soy yo. Pero también hace que la programación sea más sencilla.

Lo que haría sería implementar un filtro de /[/s]dooby (doo?)[/s]/i regulares así: /[/s]dooby (doo?)[/s]/i o si la palabra tiene el prefijo de otros, /[/s]doob(er|ed|est)[/s]/ . Esto evitaría el filtrado de palabras como assuaged, que es perfectamente válido, pero también requeriría el conocimiento de las otras variantes y la actualización del filtro real si aprende una nueva. Obviamente, todos estos son ejemplos, pero tendrías que decidir cómo hacerlo tú mismo.

No estoy a punto de escribir todas las palabras que conozco, no cuando en realidad no quiero saberlas.


La única forma de evitar la entrada ofensiva del usuario es evitar la entrada del usuario.

Si insiste en permitir la entrada del usuario y necesita moderación, entonces incorpore moderadores humanos.


Llego un poco tarde a la fiesta, pero tengo una solución que podría funcionar para algunos que lean esto. Está en javascript en lugar de php, pero hay una razón válida para ello.

Revelación completa, escribí este plugin ...

De todos modos

El enfoque que he seguido es permitir a un usuario "Opt-In" a su filtro de profanidad. Básicamente se permitirá profanidad por defecto, pero si mis usuarios no quieren leerlo, no tienen que hacerlo. Esto también ayuda con el problema "l33t sp3 @ k".

El concepto es un simple complemento de jquery que el servidor inyecta si la cuenta del cliente habilita el filtrado de malas palabras. A partir de ahí, son solo un par de líneas simples que borran los juramentos.

Aquí está la página de demostración
https://chaseflorell.github.io/jQuery.ProfanityFilter/demo/

<div id="foo"> ass will fail but password will not </div> <script> // code: $(''#foo'').profanityFilter({ customSwears: [''ass''] }); </script>

resultado

*** fallará pero la contraseña no lo hará


No conozco ninguna buena biblioteca para esto, pero hagas lo que hagas, asegúrate de que te equivocas en la dirección de dejar pasar cosas. He tratado con sistemas que no me permitirían usar "mpassell" como nombre de usuario, ya que contiene "ass" como subcadena. ¡Esa es una gran manera de alienar a los usuarios!


No lo hagas Solo lleva a problemas. Una de las experiencias personales que he tenido con los filtros de profanidad es el momento en que fui expulsado / expulsado de un canal de IRC por mencionar que "me dirigía por el puente hacia Hancock por un par de horas" o algo parecido.


No lo hagas

Porque:

  • Clbuttic
  • La profanidad no es MAL MISMO
  • La profanidad no se puede definir efectivamente
  • La mayoría de las personas probablemente no aprecian estar "protegidas" de la profanidad

Edit: Aunque estoy de acuerdo con el comentarista que dijo "la censura está mal", esa no es la naturaleza de esta respuesta.


Recolecté 2200 malas palabras en 12 idiomas: en, ar, cs, da, de, eo, es, fa, fi, fr, hi, hu, it, ja, ko, nl, no, pl, pt, ru, sv , th, tlh, tr, zh.

Las opciones de volcado MySQL, JSON, XML o CSV están disponibles.

https://github.com/turalus/openDB

Le sugiero que ejecute este SQL en su base de datos y que compruebe cada vez que el usuario ingresa algo.


Si puede hacer algo como Digg / en el que los usuarios puedan votar de forma negativa o marcar contenido obsceno ... hágalo.

Luego, todo lo que debe hacer es revisar a los usuarios "traviesos" y bloquearlos si infringen las reglas.


Tenga cuidado con los problemas de localización: lo que es una maldición en un idioma puede ser una palabra perfectamente normal en otro.

Un ejemplo actual de esto: ebay utiliza un enfoque de diccionario para filtrar "malas palabras" de los comentarios. Si intenta ingresar a la traducción alemana de "esta fue una transacción perfecta" ("das war eine perfekte Transaktion"), eBay rechazará la retroalimentación debida a malas palabras.

¿Por qué? Porque la palabra alemana para "era" es "guerra", y "guerra" está en el diccionario de ebay de "malas palabras".

Así que ten cuidado con los problemas de localización.


Una vez que tenga una buena tabla MYSQL de algunas palabras malas que desea filtrar (comencé con uno de los enlaces en este hilo), puede hacer algo como esto:

$errors = array(); //Initialize error array (I use this with all my PHP form validations) $SCREENNAME = mysql_real_escape_string($_POST[''SCREENNAME'']); //Escape the input data to prevent SQL injection when you query the profanity table. $ProfanityCheckString = strtoupper($SCREENNAME); //Make the input string uppercase (so that ''BaDwOrD'' is the same as ''BADWORD''). All your values in the profanity table will need to be UPPERCASE for this to work. $ProfanityCheckString = preg_replace(''/[_-]/'','''',$ProfanityCheckString); //I allow alphanumeric, underscores, and dashes...nothing else (I control this with PHP form validation). Pull out non-alphanumeric characters so ''B-A-D-W-O-R-D'' shows up as ''BADWORD''. $ProfanityCheckString = preg_replace(''/1/'',''I'',$ProfanityCheckString); //Replace common numeric representations of letters so ''84DW0RD'' shows up as ''BADWORD''. $ProfanityCheckString = preg_replace(''/3/'',''E'',$ProfanityCheckString); $ProfanityCheckString = preg_replace(''/4/'',''A'',$ProfanityCheckString); $ProfanityCheckString = preg_replace(''/5/'',''S'',$ProfanityCheckString); $ProfanityCheckString = preg_replace(''/6/'',''G'',$ProfanityCheckString); $ProfanityCheckString = preg_replace(''/7/'',''T'',$ProfanityCheckString); $ProfanityCheckString = preg_replace(''/8/'',''B'',$ProfanityCheckString); $ProfanityCheckString = preg_replace(''/0/'',''O'',$ProfanityCheckString); //Replace ZERO''s with O''s (Capital letter o''s). $ProfanityCheckString = preg_replace(''/Z/'',''S'',$ProfanityCheckString); //Replace Z''s with S''s, another common substitution. Make sure you replace Z''s with S''s in your profanity database for this to work properly. Same with all the numbers too--having S3X7 in your database won''t work, since this code would render that string as ''SEXY''. The profanity table should have the "rendered" version of the bad words. $CheckProfanity = mysql_query("SELECT * FROM DATABASE.TABLE p WHERE p.WORD = ''".$ProfanityCheckString."''"); if(mysql_num_rows($CheckProfanity) > 0) {$errors[] = ''Please select another Screen Name.'';} //Check your profanity table for the scrubbed input. You could get real crazy using LIKE and wildcards, but I only want a simple profanity filter. if (count($errors) > 0) {foreach($errors as $error) {$errorString .= "<span class=''PHPError''>$error</span><br /><br />";} echo $errorString;} //Echo any PHP errors that come out of the validation, including any profanity flagging. //You can also use these lines to troubleshoot. //echo $ProfanityCheckString; //echo "<br />"; //echo mysql_error(); //echo "<br />";

Estoy seguro de que hay una manera más eficiente de hacer todos esos reemplazos, pero no soy lo suficientemente inteligente como para averiguarlo (y esto parece funcionar bien, aunque de manera ineficiente).

Creo que deberías equivocarte al permitir que los usuarios se registren y usar humanos para filtrar y agregar a tu tabla de malas palabras según sea necesario. Aunque todo depende del costo de un falso positivo (palabra correcta marcada como mala) frente a un falso negativo (la palabra mala llega). En última instancia, eso debería regular lo agresivo o conservador que eres en tu estrategia de filtrado.

También sería muy cuidadoso si desea utilizar comodines, ya que a veces pueden comportarse de manera más onerosa de lo que pretende.


un sistema de filtrado de malas palabras nunca será perfecto, incluso si el programador está seguro y se mantiene al tanto de todos los desarrollos de desnudos

Dicho esto, es probable que cualquier lista de ''palabras malas'' se desempeñe tan bien como cualquier otra, ya que el problema subyacente es la comprensión del lenguaje, que es bastante difícil de tratar con la tecnología actual.

Entonces, la única solución práctica es doble:

  1. prepárate para actualizar tu diccionario con frecuencia
  2. contratar a un editor humano para corregir falsos positivos (por ejemplo, "clbuttic" en lugar de "clásico") y falsos negativos (¡Uy!

Filtros de obscenidad: ¿Mala idea, o increíblemente mala idea interrumpir?

Además, uno no puede olvidar el Untold History of Toontown''s SpeedChat , donde incluso usar una "lista blanca de palabras seguras" resultó en un niño de 14 años que lo elude rápidamente: "Quiero meter mi Jirafa de cuello largo en tu conejito blanco y esponjoso". . "

Conclusión: en última instancia, para cualquier sistema que implemente, no hay absolutamente ningún sustituto para la revisión humana (ya sea de igual a igual o no). Siéntase libre de implementar una herramienta rudimentaria para deshacerse de los drive-by''s, pero para el troll determinado, absolutamente debe tener un enfoque no basado en algoritmos.

Un sistema que elimina el anonimato e introduce la responsabilidad (algo que hace bien) también es útil, especialmente para ayudar a combatir el REGALO DE John Gabriel.

También preguntó dónde puede obtener las listas de profanidad para comenzar, un proyecto de código abierto para verificar es Dansguardian : revise el código fuente para sus listas de profanidad predeterminadas. También hay una lista de frases adicional de terceros que puede descargar para el proxy que puede ser un punto de ayuda útil para usted.

Edite en respuesta la pregunta edit: Gracias por la aclaración sobre lo que está tratando de hacer. En ese caso, si solo estás tratando de hacer un filtro de palabras simple, hay dos formas de hacerlo. Una es crear una expresión regular larga con todas las frases prohibidas que desea censurar, y simplemente hacer una expresión regular de buscar / reemplazar con ella. Una expresión regular como:

$filterRegex = "(boogers|snot|poop|shucks|argh)"

y ejecútelo en su cadena de entrada usando preg_match() para realizar pruebas al por mayor de un hit,

o preg_replace() para eliminarlos.

También puede cargar esas funciones con arrays en lugar de un solo regex largo, y para listas de palabras largas, puede ser más manejable. Consulte preg_replace() para ver algunos buenos ejemplos de cómo se pueden usar los arreglos de manera flexible.

Para ver ejemplos adicionales de programación de PHP, vea esta página para ver una clase genérica algo avanzada para el filtrado de palabras que * está fuera de las letras centrales de las palabras censuradas, y esta pregunta anterior de Desbordamiento de pila que también tiene un ejemplo de PHP (la parte más valiosa principal de allí es El enfoque de palabra filtrada basado en SQL (se puede prescindir del compensador leet-speak si lo considera innecesario).

También agregó: " Obtener la lista de palabras en primer lugar es la verdadera pregunta " . Además de algunos de los enlaces anteriores de Dansgaurdian, puede que le resulte útil este útil archivo .zip de 458 palabras.


Los filtros profanos son una mala idea. La razón es que no puedes atrapar todas las malas palabras. Si lo intentas, obtienes falsos positivos.

Atrapando palabras

Digamos que quieres atrapar la F-Word. Fácil, ¿verdad? Bien, veamos.

Puedes recorrer una cadena para encontrar "joder". Desafortunadamente, las personas engañan a los filtros hoy en día. El filtro de malas palabras no recogió "fuk".

Uno puede intentar verificar la ortografía múltiple y las variantes de la palabra, pero eso ralentizará el rendimiento de su código. Para capturar el F-Word, debes buscar "fuc", "Fuc", "fuk", "Fuk", "F ***", etc. Y la lista sigue y sigue.

Evitando la inocencia

Bien, entonces, ¿qué tal si hace que sea insensible a mayúsculas y minúsculas e ignore los espacios para que detecte "F u C k"? Eso puede sonar como una buena idea, pero alguien puede simplemente pasar por alto el filtro de malas palabras con "FUCK"

Ignoras la puntuación.

Ahora que es un problema real, ya que una frase como "¡ Demonios , ahí!" se recogerá como "infierno" y "¿Qué asco ?" recoge como "culo"

Y hay un montón de palabras que debes excluir del filtro, como "Contrasión", porque hay "tit" en él.

Las personas también pueden usar palabras sustitutas, como "Frack". ¿Bloqueas eso también? ¿Qué pasa con "la pluma es" para "el pene"? Su programa no tiene inteligencia artificial para saber si la cuerda es buena o mala.

No utilice filtros de profanidad. Son difíciles de desarrollar, y son tan lentos como un rastreo.