2010-06-07 14 views
7

Estoy haciendo una auditoría de seguridad en una aplicación de php bastante grande y me preguntaba dónde debería incluir mi validación de entrada de usuario.¿Debería la función o la persona que llama ser responsable de la validación de entrada?

¿Debo validar los datos, luego envío los datos limpios a las funciones de fondo o debo confiar en cada función para hacer su propia validación? ¿O incluso los dos?

¿Hay algún estándar o mejor práctica para este tipo de cosas?

Actualmente, la aplicación no es uniforme y me gustaría hacer las cosas más consistentes.

+0

http://symcbean.blogspot.co.uk/2017/07/validate-input-escape-output.html – symcbean

Respuesta

6

Definitivamente debe validar los datos desde el exterior tan pronto como sea posible. Dependiendo de la arquitectura, la validación de back-end dentro de las funciones responsables puede ser un segundo paso, pero no depende de la validación de back-end, pero valida los datos cuando se trata de su aplicación.

Los profesionales con funciones de validación en el interior como complemento a la validación anterior es que es más fácil (y más seguro) mantener el sistema debido a que los desarrolladores (más descuidados) no pueden romper la aplicación. Si tiene una aplicación con soporte para complementos, p. para complementos de terceros, las funciones seguras también son obligatorias.

+0

Un problema con esto es que cuando la aplicación cuando se trata de su aplicación, es posible que no sepa cómo se usa la variable.Por esta razón, generalmente es mejor higienizar inmediatamente antes de usar, esto también lo hace ** mucho más fácil ** para la revisión por pares basada en la seguridad. – rook

2

Creo que si puede hacer ambas cosas, y el tiempo/recursos no son un problema, ¿por qué no?

2

Depende del alcance/definición de la aplicación. Pero tradicionalmente, sus funciones se utilizan en lugares de mayo $ object-> doSomething() hace precisamente eso. Al confiar en la validación allí, evitas la capacidad de hacer algo() de tu propio acceso, ¿sabes?

Demasiado, si mantiene la validación fuera, puede administrarla fácilmente. No es necesario buscarlo en esa función interna particular. Consérvelo OOP, pero más como

$ data = $ validator-> sanitizeSomething ($ data); $ object-> doSomething ($ data);

esto mantiene sus reglas de validación separadas y fáciles de gestionar, así como sus funciones internas.

Elaborar, supongamos que tiene un objeto db que añade una matriz a la mesa:

class db { 
    function addRow($table, $associativeArray) { 
     // primitive i know, just an example 
    } 
} 

habría usted quiere que su validación ahí?

function addRow($table, $associativeArray) { 
    if(isset($assiciativeArray['description']) { 
     // validate 
    } 
} 

sería tonto - te gustaría que en el objeto que se está trabajando en

class product { 
    function update() { 
     if($this->validate()) { 
      $this->db->addRow($this->toArray()); // or something, you get the idea, ya? 
     } 
    } 
    function validate() { 
     if($this->description != "") { 
     return true; 
     } 
     return false; 
    } 
} 
8

Tanto es la mejor respuesta. La validación de datos debería ocurrir en cada función que manejará los datos para evitar el problema del Desarrollo impulsado por Hope (HDD)

+0

¡Tengo una gran simpatía con este punto de vista! Realmente es la forma correcta de hacerlo. Aquí es donde PHP se convierte en un dolor de cabeza para trabajar, porque la debilidad del texto te obliga a crear tus propios controles solo para asegurarte de que todos los argumentos de funciones son del tipo correcto = ( –

+0

Pero tiene que haber un equilibrio. Si hago una clase con una función que solo toma una matriz. Esa clase si para un objeto en particular, esa función una tarea en particular. Así que si le envío una cadena y está esperando una matriz, eso no es HDD - eso es ser tonto. Se mete en la imagen más grande : ¿la aplicación está bien documentada? ¿Existen métodos sólidos disponibles públicamente que encapsulan la funcionalidad de manera elegante? –

2

Validar en el backend es como examinar a los pasajeros después de que hayan abordado el avión. El objetivo de la validación es evitar la inyección de elementos que puedan paralizar su aplicación. Entonces debe validar antes de ingresar a la puerta :)

+0

Siguiendo esa analogía, si no confías en que las personas que se filtran en la puerta siempre hagan su trabajo correctamente cada vez es más seguro hacer un doble -comprobar antes de que despegue el avión: p Pero definitivamente debería captar la entrada incorrecta más temprano que tarde, pero estar doblemente seguro de comprobar ambas cosas. – Davy8

Cuestiones relacionadas