phantomjs mediawiki casperjs spam spam-prevention

Detección confiable de robots de spam basados en PhantomJS



mediawiki casperjs (3)

No hay una manera sólida: PhantomJS y Selenium, son solo software que se utilizan para controlar el software del navegador, en lugar de que un usuario lo controle.

Con PhantomJS 1.x, en particular, creo que hay un poco de JavaScript que puedes usar para bloquear el navegador que explota un error en la versión de WebKit que se está utilizando (es equivalente a Chrome 13, por lo que muy pocos usuarios genuinos deberían verse afectados) . (Recuerdo que esto se mencionó en la lista de correo Phantom hace unos meses, pero no sé si se describió el JS exacto que se debe usar). Más generalmente, podría usar una combinación de agente-usuario que coincida con la detección de características. Por ejemplo, si un navegador dice ser "Chrome 23" pero no tiene una característica que Chrome 23 tiene (y que Chrome 13 no tenía), entonces sospeche.

Como usuario, odio los CAPTCHA también. Pero son bastante efectivos ya que aumentan el costo para el spammer: él tiene que escribir más software o contratar humanos para leerlos. (Por eso creo que los CAPTCHA fáciles son lo suficientemente buenos: los que molestan a los usuarios son aquellos en los que no tienen idea de lo que dice y tienen que seguir presionando recargar para obtener algo que reconozca).

Un enfoque (que creo que usa Google) es mostrar el CAPTCHA condicionalmente. Por ejemplo, los usuarios que han iniciado sesión nunca se muestran. Los usuarios que ya han hecho una publicación en esta sesión no vuelven a mostrarla. No se muestran a los usuarios de direcciones IP en una lista blanca (que podría construirse a partir de publicaciones legítimas anteriores). O a la inversa, simplemente muéstrelos a los usuarios de una lista negra de rangos de IP.

Sé que ninguno de esos enfoques es perfecto, lo siento.

¿Hay alguna manera de detectar constantemente PhantomJS / CasperJS? He estado lidiando con una serie de spambots maliciosos creados con él y he podido bloquearlos principalmente en función de ciertos comportamientos, pero tengo curiosidad por saber si hay una manera sólida de saber si CasperJS está en uso, como tratar Las adaptaciones constantes se vuelven un poco molestas.

No creo en usar Captchas. Son una experiencia de usuario negativa y ReCaptcha nunca ha trabajado para bloquear el spam en mis instalaciones de MediaWiki. Como nuestro sitio no tiene registros de usuarios (panel de discusión anónimo), deberíamos tener una entrada de Captcha para cada publicación. Recibimos varios miles de publicaciones legítimas al día y un Captcha vería ese número divebomb.


Podría detectar el fantasma en el lado del cliente al verificar la propiedad window.callPhantom . La secuencia de comandos mínima en el lado del cliente es:

var isPhantom = !!window.callPhantom;

Aquí hay una esencia con la prueba de concepto de que esto funciona.

Un spammer podría intentar eliminar esta propiedad con page.evaluate y luego dependerá de quién sea más rápido. Después de haber intentado la detección, se vuelve a cargar con el formulario de envío y un CAPTCHA o no, dependiendo del resultado de su detección.

El problema es que incurres en una redirección que podría molestar a tus usuarios. Esto será necesario con cada técnica de detección en el cliente. Que se puede subvertir y cambiar con onResourceRequested .

En general, no creo que esto sea posible, porque solo puede detectar en el cliente y enviar el resultado al servidor. Agregar el CAPTCHA combinado con el paso de detección con solo una carga de página no agrega nada, ya que podría eliminarse con la misma facilidad con phantomjs / casperjs. La defensa basada en el agente de usuario tampoco tiene sentido, ya que se puede cambiar fácilmente en phantomjs / casperjs.


Yo comparto mucho su opinión sobre CAPTCHA. Enumeraré lo que he podido detectar hasta ahora, para mi propio script de detección, con objetivos similares. Es solo parcial, ya que son muchos más navegadores sin cabeza .

Es bastante seguro utilizar las propiedades de las ventanas expuestas para detectar / asumir esos navegadores en particular sin cabeza:

window._phantom (or window.callPhantom) //phantomjs window.__phantomas //PhantomJS-based web perf metrics + monitoring tool window.Buffer //nodejs window.emit //couchjs window.spawn //rhino

Lo anterior se recopila de jslint doc y se prueba con phantom js.

Controladores de automatización del navegador (utilizados por BrowserStack u otros servicios de captura web para instantáneas):

window.webdriver //selenium window.domAutomation (or window.domAutomationController) //chromium based automation driver

Las propiedades no siempre están expuestas y estoy buscando otras formas más robustas de detectar tales bots, que probablemente lanzaré como un script completo cuando termine. Pero eso responde principalmente a tu pregunta.

Aquí hay otro método bastante sólido para detectar de manera más amplia los navegadores sin cabeza con capacidad para JS:

if (window.outerWidth === 0 && window.outerHeight === 0){ //headless browser }

Esto debería funcionar bien porque las propiedades son 0 de forma predeterminada, incluso si el tamaño de la ventana virtual está configurado por navegadores sin cabeza, y por defecto no puede informar el tamaño de una ventana del navegador que no existe. En particular, Phantom JS no admite externWith o externHeight .

ADENDA: Sin embargo, hay un error de Chrome / Blink con las dimensiones externas / internas. Chromium no informa esas dimensiones cuando una página se carga en una pestaña oculta , como cuando se restaura desde la sesión anterior. Safari no parece tener ese problema. .

Actualización: Resulta que iOS Safari 8+ tiene un error con outerWidth y outerHeight en 0, y una vista web de Sailfish también puede. Entonces, si bien es una señal, no se puede usar solo sin tener en cuenta estos errores. Por lo tanto, advertencia : no utilice este fragmento de código en bruto a menos que realmente sepa lo que está haciendo.

PD: Si conoce otras propiedades de navegador sin cabeza que no figuran en esta lista, compártalas en los comentarios.