"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Codificación segura PHP: no deje que el código se suelte

Codificación segura PHP: no deje que el código se suelte

Publicado el 2024-08-20
Navegar:670

El otro día estaba teniendo una charla informal con un amigo que es líder tecnológico en una startup exitosa, y mientras veíamos la final olímpica de waterpolo femenino, comenzamos a hablar sobre un error de PHP que encontré en la naturaleza. ?. Como él era líder tecnológico y yo era desarrollador intermedio, esperaba que él ya hubiera abordado este problema en su rutina diaria, pero bueno... por sorprendente que parezca, no lo había hecho.
El "fallo" del que hablo, y probablemente ya lo habrás adivinado, no es más que la comparación vaga de PHP. Ahora, para ser justos, realmente no lo llamaría un fracaso, sino una característica, pero su uso puede ser tan peligroso que, en ese sentido, ¡es un fallo! ¡Pongámonos manos a la obra!

PHP Secure Coding: Don

Tabla de contenido

  • Comparación suelta de PHP
  • Escenarios vulnerables
    • El sistema de inicio de sesión inseguro
    • La autorización insegura con un giro
  • Mitigación del error de comparación flexible
  • Conclusión
  • Muestra amor @Sudorealm

Comparación suelta de PHP

La comparación flexible en PHP es cuando comparas dos valores usando el operador ==, que no verifica los tipos de datos de las variables que se comparan. PHP intentará convertir los valores a un tipo común antes de compararlos.

if ('string' == true){
 echo 'Weedle I choose you';
}
else{
 echo 'Charizard I choose you';
}

Lo creas o no, estamos a punto de enviar un Weedle de nivel 3 a la batalla aquí, mientras nuestro Charizard permanece sin usar. ¿POR QUÉ? Bueno, en el ejemplo anterior, PHP convierte la cadena 'string' a true antes de compararla con true, lo que lleva a una comparación verdadera. Este comportamiento, si bien a veces es útil, puede ser peligroso si no se comprende y controla adecuadamente.

Consulte esta tabla de comparaciones sueltas de los documentos PHP para obtener más información

Puede que no parezca tanto al principio, pero, créame, a los ojos de un desarrollador capacitado, este truco surgido de la nada podría provocarles escalofríos y enviarlos a una ola de refactorización de código de producción.

Escenarios vulnerables

En esta sección del artículo, intentaré brindarte algunos bloques de código que, cuando se encuentren en la naturaleza, podrían brindarte una buena recompensa por errores, además, si encuentras algo remotamente similar a tu código base... cámbialo. ?

El sistema de inicio de sesión inseguro

En el siguiente fragmento se ve una lógica de sistema de inicio de sesión muy básica.

$username = $_POST['username'];
$password = $_POST['password'];

if ($username == 'admin' && $password == '12345') {
    // Grant access
}

Digamos que un hacker astuto manipula los datos enviados y los convierte en: $_POST['username'] = true y $_POST['password'] = true, lo que resultará en:

$username = $_POST['username'];
$password = $_POST['password'];

if (true == 'admin' && true == '12345') {
    // Grant access
}

# Now that hacker has been granted access to our App... Good for him, not for us

Si te preguntas cómo un hacker podría alterar nuestros datos, tengo dos respuestas para ti desde lo más alto de mi cabeza:

  1. Solicitud personalizada con rizo.
  2. Burpsuite

Seguimos adelante.

La autorización insegura con un giro

Aquí es donde muestro un problema con PHP que podría sorprenderte.

$user_role = $_POST['user_role']; // Example: 'admin', 'editor', 'viewer'

// Authorization check using a switch statement
switch ($user_role) {
    case 'crazyDifficultAdminRoleNooneWouldEverGuess':
        // Admin privileges
        echo "Access granted: Super Admin level";
        break;

    case 'editor':
        // Editor privileges
        echo "Access granted: Editor level";
        break;

    case 'viewer':
        // Viewer privileges
        echo "Access granted: Viewer level";
        break;

    default:
        // No access
        echo "Access denied: Invalid role";
        break;
}

Este código ya es vulnerable a la manipulación de datos, ya que los piratas informáticos podrían adivinar los roles y cambiar los suyos para acceder a diferentes niveles de autorización.
Sin embargo, es posible que nos sintamos un poco seguros porque nunca podrán adivinar el nombre de nuestra función de superadministrador.

¿Pero qué pasa si no tienen que adivinar nada?☠️

¿Sabías que Switch Case utiliza una comparación flexible? ¡Ja! ¡Quizás te sorprendas ahora!
Esto significa que si el hacker agrega $_POST['user_role'] = true, accederá a nuestro primer caso en nuestra declaración de cambio sin importar el valor. ¿No es eso un dolor en el trasero? Lea los documentos.

Mitigar el error de comparación flexible

Mitigar el error de comparación flexible es fundamental para garantizar la seguridad y confiabilidad de sus aplicaciones PHP. El uso de comparación estricta === y la expresión de coincidencia, en las versiones PHP 8.0, juega un papel vital en este proceso. A diferencia del operador de comparación flexible ==, que puede generar resultados inesperados y potencialmente peligrosos debido al malabarismo de tipos de PHP, la comparación estricta garantiza que se verifiquen tanto el valor como el tipo de las variables. Esto elimina vulnerabilidades como la coerción de tipos no intencionada, que podría aprovecharse para eludir los controles de seguridad.

Aquí hay una solución al error de autorización insegura usando expresión de coincidencia:

$user_role = $_POST['role'];

$response = match ($user_role) {
    'crazyDifficultAdminRoleNooneWouldEverGuess' => "Access granted: Super Admin level",
    'editor' => "Access granted: Editor level",
    'viewer' => "Access granted: Viewer level",
    default => "Access denied: Invalid role",
};

echo $response; # This outputs: 'Access denied: Invalid role' when role is set to true

Conclusión

¿Sabías acerca de los peligros de la comparación flexible y el malabarismo de tipos en PHP? Si no lo hiciste, ahora lo haces. Deje que este sencillo artículo le sirva como recordatorio para leer siempre la documentación y desarrollar una comprensión sólida de todo lo que utiliza al programar. ¡La curiosidad es clave cuando te esfuerzas por convertirte en el mejor en cualquier cosa que hagas!

Al adoptar la estricta disciplina de === y la gran precisión de coincidencia, puedes mantener tu código PHP bajo control, asegurándote de que se comporte exactamente como esperas. Recuerde, un poco de rigor ahora puede ahorrarle muchos dolores de cabeza en el futuro. Deje que esto sea un empujón divertido para que, sin importar dónde se encuentre en su viaje de codificación, siempre haya algo nuevo que aprender. Así que mantén los ojos abiertos, mantén la curiosidad y no dejes que esas comparaciones vagas se escapen de la red. ?

Acerca de mí

Puedes encontrar más información sobre mí en el espacio de mi blog personal en sudorealm.com.

Si te gusta mi estilo de escritura y mi contenido, no dudes en presionar el botón de seguir y ¡sucederán cosas mágicas! ??

Declaración de liberación Este artículo se reproduce en: https://dev.to/athanstan/php-secure-coding-dont-let-the-code-get-loose-26ja?1 Si hay alguna infracción, comuníquese con [email protected] para borrarlo
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3