Pregunta

Usuario equivale a no confiable.Nunca confíes en las aportaciones de usuarios no confiables.Lo entiendo.Sin embargo, me pregunto cuándo es el mejor momento para desinfectar las entradas.Por ejemplo, ¿almacena ciegamente la entrada del usuario y luego la desinfecta cada vez que se accede a ella o se utiliza, o desinfecta la entrada inmediatamente y luego almacena esta versión "limpia"?Quizás también haya otros enfoques en los que no he pensado además de estos.Me inclino más hacia el primer método, porque cualquier dato que provenga de la entrada del usuario aún debe abordarse con cautela, donde los datos "limpiados" aún pueden ser peligrosos, sin saberlo o accidentalmente.De cualquier manera, ¿qué método cree la gente que es mejor y por qué motivos?

¿Fue útil?

Solución

Me gusta desinfectarlo lo antes posible, lo que significa que la desinfección ocurre cuando el usuario intenta ingresar datos no válidos.Si hay un cuadro de texto para su edad y escriben cualquier cosa que no sea un número, no dejo que se presione la tecla de la letra.

Luego, sea lo que sea que esté leyendo los datos (a menudo un servidor), hago una verificación de cordura cuando leo los datos, solo para asegurarme de que no se escape nada debido a un usuario más decidido (como editar archivos manualmente o incluso modificar paquetes). !)

Editar:En general, desinfecte lo antes posible y cada vez que haya perdido de vista los datos aunque sea por un segundo (p. ej.Guardar archivo -> Abrir archivo)

Otros consejos

Desafortunadamente, casi ninguno de los participantes entiende claramente de qué están hablando.Literalmente.Solo @Kibbee logró aclarar las cosas.

Este tema tiene que ver con la desinfección.Pero la verdad es que algo así como el amplio término "desinfección de propósito general" del que todo el mundo está tan ansioso de hablar es simplemente no existe.

Hay un millón de medios diferentes, cada uno requiere su propio formato de datos distinto. Es más, incluso Un solo medio determinado requiere un formato diferente para sus partes..Digamos que el formato HTML es inútil para JavaScript incrustado en una página HTML.O el formato de cadena es inútil para los números en la consulta SQL.

De hecho, tal "desinfección lo antes posible", como se sugiere en la mayoría de las respuestas votadas, es simplemente imposible.Ya que uno simplemente no puede decir en qué determinado medio o parte del medio se utilizarán los datos.Digamos que nos estamos preparando para defendernos de la "inyección SQL", escapando de todo lo que se mueve.Pero ¡vaya!- algunos campos obligatorios no se completaron y tenemos que volver a completar los datos en el formulario en lugar de en la base de datos...con todas las barras agregadas.

Por otro lado, escapamos diligentemente de todas las "entradas del usuario"...pero en la consulta SQL no lo ponemos entre comillas, ya que es un número o identificador.Y ninguna "desinfección" nos ayudó jamás.

Por otro lado, está bien, hicimos todo lo posible para desinfectar las terribles, poco confiables y desdeñosas "entradas de los usuarios"...pero en algún proceso interno usamos estos mismos datos sin ningún formato (¡ya que hicimos lo mejor que pudimos!), ¡y ups!Tenemos inyección de segundo orden en todo su esplendor.

Entonces, desde el punto de vista del uso en la vida real, la única forma adecuada sería

  • formateo, no cualquier "desinfección"
  • justo antes de usar
  • de acuerdo con ciertas reglas medias
  • e incluso siguiendo subreglas requeridas para las diferentes partes de este medio.

Desinfecto mis datos de usuario de forma muy parecida a Radu...

  1. Primero, el lado del cliente usa expresiones regulares y toma el control de los caracteres permitidos entrada en campos de formulario determinados mediante javascript o jQuery vinculados a eventos, como onChange o OnBlur, que elimina cualquier entrada no permitida antes de que pueda ser presentado.Sin embargo, date cuenta de que esto realmente solo tiene el efecto de dejar que esos Los usuarios saben que los datos también se verificarán en el lado del servidor.Es más una advertencia que una protección real.

  2. En segundo lugar, y ya casi no veo que se haga esto en estos días, que la primera comprobación sea done del lado del servidor es verificar la ubicación desde donde se envía el formulario.Al permitir solo el envío de formularios desde una página que haya designado como válida ubicación, puede matar el script ANTES de haber leído cualquier dato.Concedido Eso en sí mismo es insuficiente, ya que un buen hacker con su propio servidor puede 'suplantar' tanto el dominio como la dirección IP para que parezca a su script que viene desde una ubicación de formulario válida.

  3. A continuación, y ni siquiera debería tener que decir esto, pero siempre, y quiero decir SIEMPRE, correr sus scripts en modo de mancha.Esto te obliga a no ser perezoso y a ser diligente Paso número 4.

  4. Desinfecte los datos del usuario lo antes posible utilizando expresiones regulares bien formadas y apropiadas para Los datos que se esperan de cualquier campo determinado del formulario.No tomes atajos como El infame 'cuerno mágico del unicornio' para superar tus controles de contaminación...O también puede desactivar la verificación de manchas en primer lugar para todo lo bueno Servirá para su seguridad.Eso es como darle a un psicópata un cuchillo afilado, tu garganta, y diciendo: 'Realmente no me harás daño con eso, ¿verdad?'.

    Y aquí es donde difiero de la mayoría de los demás en este cuarto paso, ya que solo desinfecto los datos de usuario que realmente voy a USAR de una manera que pueda presentar una seguridad riesgo, como cualquier llamada al sistema, asignaciones a otras variables o cualquier escritura en Almacenar datos.Si solo estoy usando los datos ingresados por un usuario para hacer una comparación con los datos Yo mismo he almacenado en el sistema (por lo tanto, sabiendo que mis propios datos están seguros), entonces no me molesto en desinfectar los datos del usuario, ya que nunca lo voy a usar de una manera Eso se presenta como un problema de seguridad.Por ejemplo, tome una entrada de nombre de usuario como Un ejemplo.Utilizo el nombre de usuario ingresado por el usuario solo para compararlo con una coincidencia en mi base de datos, y si es cierto, después de eso utilizo los datos de la base de datos para realizar todas las demás funciones que pueda requerir en el script, sabiendo que es seguro, y nunca Vuelva a utilizar los datos de los usuarios después de eso.

  5. Por último, es filtrar todos los intentos de envíos automáticos por parte de los robots en estos días, con un sistema de 'autenticación humana', como Captcha.Esto es lo suficientemente importante en estos días que me tomé el tiempo de escribir mi propio esquema de "autenticación humana" que usa fotos y una entrada para que el 'humano' ingrese lo que ve en la imagen.Hice esto porque He descubierto que los sistemas tipo Captcha realmente molestan a los usuarios (se puede decir por su ojos entrecerrados por tratar de descifrar las letras distorsionadas...por lo general, sobre y otra vez).Esto es especialmente importante para los scripts que usan SendMail o SMTP para el correo electrónico, ya que estos son los favoritos de sus hambrientos robots de spam.

Para resumir, se lo explicaré como se lo hago a mi esposa...Su servidor es como un club nocturno popular, y cuantos más porteros tenga, menos problemas tendrá en la discoteca.Tengo dos porteros afuera de la puerta (validación del lado del cliente y autenticación humana), un portero justo dentro de la puerta (verificando la ubicación válida de envío del formulario...'¿De verdad eres tú en esta identificación?'), y varios porteros más en proximidad a la puerta (ejecutando el modo taint y usando buenas expresiones regulares para verificar el datos del usuario).

Sé que esta es una publicación anterior, pero la sentí lo suficientemente importante como para que cualquiera que la lea después de mi visita aquí se dé cuenta de que no existe.bala mágica' cuando se trata de seguridad, y es necesario que todos estos trabajen en conjunto para hacer que los datos proporcionados por el usuario estén seguros.Usar solo uno o dos de estos métodos es prácticamente inútil, ya que su poder solo existe cuando todos se unen.

O en resumen, como solía decir mi mamá...'Más vale prevenir que lamentar".

ACTUALIZAR:

Una cosa más que estoy haciendo estos días es codificar en Base64 todos mis datos y luego cifrar los datos de Base64 que residirán en mis bases de datos SQL.Se necesita alrededor de un tercio más de bytes totales para almacenarlos de esta manera, pero en mi opinión, los beneficios de seguridad superan el tamaño adicional de los datos.

Depende del tipo de desinfección que estés haciendo.

Para protegerse contra la inyección de SQL, no haga nada con los datos en sí.Simplemente use declaraciones preparadas y de esa manera no tendrá que preocuparse por alterar los datos que el usuario ingresó y que afecten negativamente su lógica.Tienes que desinfectar un poco, para asegurarte de que los números sean números y las fechas sean fechas, ya que todo es una cadena tal como proviene de la solicitud, pero no intentes hacer ninguna verificación para hacer cosas como bloquear palabras clave ni nada por el estilo.

Para protegerse contra ataques XSS, probablemente sería más fácil reparar los datos antes de almacenarlos.Sin embargo, como otros mencionaron, a veces es bueno tener una copia impecable de exactamente lo que el usuario ingresó, porque una vez que lo cambias, se pierde para siempre.Es casi una lástima que no exista una forma infalible de garantizar que su aplicación solo publique HTML desinfectado de la misma manera que puede asegurarse de no quedar atrapado por la inyección SQL mediante el uso de consultas preparadas.

Lo más importante es ser siempre coherente a la hora de escapar.Una doble desinfección accidental es poco convincente y no desinfectar es peligroso.

Para SQL, solo asegúrese de que su biblioteca de acceso a la base de datos admita variables de vinculación que escapen automáticamente los valores.Cualquiera que concatene manualmente la entrada del usuario en cadenas SQL debería saberlo mejor.

Para HTML, prefiero escapar en el último momento posible.Si destruye la entrada del usuario, nunca podrá recuperarla, y si comete un error, podrá editarla y corregirla más tarde.Si destruyes su entrada original, desaparecerá para siempre.

Temprano es bueno, definitivamente antes de intentar analizarlo.Todo lo que vaya a generar más adelante, o especialmente a pasar a otros componentes (es decir, shell, SQL, etc.), debe desinfectarse.

Pero no se exceda; por ejemplo, las contraseñas se codifican antes de almacenarlas (¿verdad?).Las funciones hash pueden aceptar datos binarios arbitrarios.Y nunca imprimirás una contraseña (¿verdad?).Así que no analices las contraseñas ni las desinfectes.

Además, asegúrese de realizar la desinfección desde un proceso confiable: JavaScript/cualquier cosa del lado del cliente es peor que una seguridad/integridad inútil.(Sin embargo, fallar temprano podría proporcionar una mejor experiencia de usuario; simplemente hágalo en ambos lugares).

Perl tiene una opción de contaminación que considera toda la entrada del usuario "contaminada" hasta que se verifica con una expresión regular.Los datos contaminados se pueden utilizar y transmitir, pero contaminan cualquier dato con el que entren en contacto hasta que no estén contaminados.Por ejemplo, si la entrada del usuario se agrega a otra cadena, la nueva cadena también está contaminada.Básicamente, cualquier expresión que contenga valores contaminados generará un resultado contaminado.

Los datos contaminados se pueden distribuir a voluntad (datos contaminados a medida que avanzan), pero tan pronto como son utilizados por un comando que tiene efecto en el mundo exterior, el script Perl falla.Entonces, si uso datos contaminados para crear un archivo, construir un comando de shell, cambiar el directorio de trabajo, etc., Perl fallará con un error de seguridad.

No conozco otro idioma que tenga algo así como "contaminación", pero usarlo ha sido muy revelador.Es sorprendente lo rápido que se difunden los datos contaminados si no se eliminan de inmediato.Cosas que son naturales y normales para un programador, como establecer una variable basada en los datos del usuario o abrir un archivo, parecen peligrosas y arriesgadas con la contaminación activada.Entonces, la mejor estrategia para hacer las cosas es eliminar la contaminación tan pronto como se obtienen algunos datos del exterior.

Y sospecho que esa también es la mejor manera en otros idiomas:valide los datos del usuario de inmediato para que los errores y los agujeros de seguridad no se propaguen demasiado.Además, debería ser más fácil auditar el código en busca de agujeros de seguridad si los agujeros potenciales están en un solo lugar.Y nunca se puede predecir qué datos se utilizarán y con qué fin más adelante.

Mi opinión es desinfectar la entrada del usuario tan pronto como sea posible en el lado del cliente y en el lado del servidor, lo estoy haciendo así

  1. (lado del cliente), permitir al usuario Introduzca solo claves específicas en el campo.
  2. (lado del cliente), cuando el usuario vaya al siguiente campo usando onblur, pruebe la entrada que ingresó contra una expresión regular, y avisar al usuario si algo no es bueno.
  3. (lado del servidor), pruebe la entrada nuevamente, if field debe ser INTEGER verifique eso (en PHP puede usar is_numeric() ), if tiene un formato conocido Compruébalo con una expresión regular, todos otros (como comentarios de texto), simplemente escapar de ellos.Si hay algo sospechoso, detenga la ejecución del script y envíe un aviso al usuario indicando que los datos que ingresó no son válidos.

Si algo realmente parece un posible ataque, el script me envía un correo y un SMS, para que pueda verificarlo y tal vez prevenirlo lo antes posible, solo necesito verificar el registro donde estoy ingresando todas las entradas del usuario, y los pasos que realizó el script antes de aceptar la entrada o rechazarla.

Limpie los datos antes de almacenarlos.Generalmente no deberías estar actuando CUALQUIER Acciones SQL sin limpiar primero la entrada.No querrás someterte a un ataque de inyección SQL.

En cierto modo sigo estas reglas básicas.

  1. Realice únicamente acciones de modificación de SQL, como INSERTAR, ACTUALIZAR, ELIMINAR mediante POST.Nunca OBTÉN.
  2. Escapa de todo.
  3. Si espera que la entrada del usuario sea algo, asegúrese de verificar que sea ese algo.Por ejemplo, si solicita un número, asegúrese de que sea un número.Utilice validaciones.
  4. Utilice filtros.Limpiar caracteres no deseados.

¡Los usuarios son malvados!

Bueno, tal vez no siempre, pero mi enfoque es siempre sanear de inmediato para asegurar que nada riesgoso se acerque a mi backend.

El beneficio adicional es que puede proporcionar información al usuario si desinfecta el punto de entrada.

Suponga que todos los usuarios son maliciosos.Desinfectar todos los insumos lo antes posible.Punto final.

Desinfecto mis datos justo antes de procesarlos.Es posible que deba tomar los campos Nombre y Apellido y concatenarlos en un tercer campo que se inserta en la base de datos.Voy a desinfectar la entrada incluso antes de realizar la concatenación para no obtener ningún tipo de error de procesamiento o inserción.Cuanto antes mejor.Incluso usar Javascript en la interfaz (en una configuración web) es ideal porque, para empezar, eso ocurrirá sin que ningún dato llegue al servidor.

Lo aterrador es que es posible que incluso desees comenzar a desinfectar los datos que salen de tu base de datos también.La reciente oleada de ataques de inyección SQL de ASPRox que han estado circulando son doblemente letales porque infectarán todas las tablas de una base de datos determinada.Si su base de datos está alojada en algún lugar donde hay varias cuentas alojadas en la misma base de datos, sus datos se corrompen debido al error de otra persona, pero ahora se ha unido a las filas de alojamiento de malware para sus visitantes sin culpa inicial suya. .

Claro que esto implica mucho trabajo inicial, pero si los datos son críticos, entonces es una inversión que vale la pena.

Encuentro que limpiarlo inmediatamente tiene dos ventajas.Uno, puede validarlo y proporcionar comentarios al usuario.Segundo, no tienes que preocuparte por consumir los datos en otros lugares.

La entrada del usuario siempre debe tratarse como maliciosa antes de pasar a las capas inferiores de su aplicación.Maneje siempre la entrada de desinfección lo antes posible y, por ningún motivo, debe almacenarse en su base de datos antes de verificar si hay intenciones maliciosas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top