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!
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.
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. ?
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:
Seguimos adelante.
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 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
¿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. ?
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! ??
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