d'Economía.net
WORDPRESS

Uso de ChatGPT para ayudar a proteger el código fuente


Para ir directo al grano, no voy a decir que debamos depender de herramientas de inteligencia artificial para ayudarnos a escribir código verdaderamente seguro. Esto no quiere decir que podamos usar herramientas como ChatGPT para ayudar a proteger el código fuente, pero dada la forma en que estas utilidades se entrenan a través de sus LLM, hay mucho que pueden ofrecer. En resumen, no menosprecie a los analistas de seguridad que, por naturaleza, están capacitados en esto precisamente.

Dicho esto, he estado usando herramientas como ChatGPT y otras herramientas de desarrollo de IA para ayudar a hacer recomendaciones sobre cómo hacer que el código sea más seguro. Daré un ejemplo básico de lo que proporcioné, lo que produjo y mis pensamientos al respecto.

Tenga en cuenta que este es solo un caso único, aislado y simple, por lo que hay mucho que puede recomendar. La conclusión, para mí, no es tanto el código que recomendó sino cómo se ofreció a cambiar lo que había escrito originalmente (y luego investigando el por qué optó por utilizar ciertas llamadas a funciones en lugar de otras).


La intención del código

En la función que voy a compartir, el propósito es observar los datos en el REQUEST_URI del $_SERVER matriz, separe los componentes del URI y luego analícelos para determinar cuál es el mejor curso de acción a seguir.

Es decir, ¿lo dividimos en una parte y redirigimos a otra página o nos eludimos de la funcionalidad porque tiene un formato incorrecto o no encaja con el esquema de la regla de reescritura que tengo implementada?

El código

La función inicial

Escribí la función inicial así:

add_action('template_redirect', function() {
  $requestUri = $_SERVER['REQUEST_URI'];
  $requestUriParts = array_filter(explode('/', $requestUri));

  if (
    count($requestUriParts) === 2 && 
    $requestUriParts[0] === 'report' && 
    is_numeric($requestUriParts[1])) {
        $userId = intval($requestUriParts[1]);
        include plugin_dir_path(__FILE__) . 'templates/report.php';
        exit;
    }
});

Por supuesto, hice algunas concesiones para mantenerlo relativamente simple. Es decir, no hay manejo de excepciones y no hay condicionales para manejar el caso en que los índices de la matriz no sean válidos.

Pero parte de esto es ver cuánto puede mejorar la IA el código anterior. Son cosas claves para llevar, a pesar de ello. no manejo de situaciones fuera del condicional, son:

  • Estoy verificando que la matriz tenga la cantidad adecuada de partes,
  • El primer índice de la matriz es report,
  • El segundo índice de la matriz es un número entero,
  • Y si todo lo anterior es cierto, lo redireccionaremos a una plantilla personalizada.

Nuevamente, hay algunos problemas inmediatos que puede detectar con esto (como el caso de las cadenas, el rango de números enteros para las ID de usuario y si el archivo existe).

Pero yo divago. Esto es lo que introduje en ChatGPT para ayudar a proteger el código fuente.

El código seguro

Dado el código anterior, esto es lo que produjo ChatGPT:

add_action('template_redirect', function () {
    $requestUri = filter_var($_SERVER['REQUEST_URI'], FILTER_SANITIZE_URL);
    $requestUriParts = array_values(array_filter(explode('/', $requestUri)));

    if (
        count($requestUriParts) === 2 &&
        strtolower($requestUriParts[0]) === 'report' &&
        ctype_digit($requestUriParts[1])
    ) {
        $userId = intval($requestUriParts[1]);

        // Validate $userId and ensure it's within an appropriate range
        if ($userId > 0 && $userId <= 1000000) { // Adjust the upper limit as needed
            $templatePath = plugin_dir_path(__FILE__) . 'templates/report.php';

            // Check if the template file exists before including it
            if (file_exists($templatePath)) {
                include $templatePath;
                exit;
            } else {
                // Handle the case where the template file is missing
                die('Report template not found.');
            }
        } else {
            // Handle invalid user IDs
            die('Invalid user ID.');
        }
    } else {
        // Handle invalid URLs
        die('Invalid URL.');
    }
});

Algunas de las cosas que inmediatamente Lo que me llama la atención en términos de mejorar el código son:

  • FILTER_SANITIZE_URL
  • strtolower sobre el report componente de la URL
  • ctype_digit en vez de is_numeric
  • Verificar un rango adecuado de ID de usuario
  • Verificando que el archivo de plantilla existe
  • Manejando cada caso donde podría fallar

Ahora, en términos de seguridad, no sé dónde caería esto dado que no se trata tanto de escribir o leer datos como de desinfectarlos y validarlos antes de redirigir a un usuario a una página que debería existir.

Pero sí me gustaron los pasos que se tomaron porque son cosas que debería implementar de forma natural como ingenieros. Es decir, desinfectar la URL, verificar la existencia de archivos y asegurarse de que los rangos de ID sean aceptables.

Sin embargo, esto es lo que me pareció la parte más interesante:

  • is_numeric. Determina si la variable dada es un número o una cadena numérica. (Una cadena PHP se considera numérica si puede interpretarse como un int o un float).
  • ctype_digit. Comprueba si todos los caracteres de la cadena proporcionada, textson numéricos.

Dadas las definiciones anteriores, podemos verificar que is_numeric(-5) volvería verdadero donde ctype_digit(-5) volvería false. Más, is_numeric(5.5) será true y ctype_digit(5.5) será false. Esto es importante, especialmente cuando trabaja con números enteros no negativos, como los que representan ID de usuario en un sistema como WordPress.


No recomiendo escribir código diferido (como mi código de ejemplo anterior 🙃), introducirlo en un sistema de inteligencia artificial y dejar que funcione para usted. Pero si ha escrito algo tan sólido y seguro como cree que puede hacerlo, entonces Alimentar eso con una IA tiene más sentido, ya que puede ayudarte a llegar un poco más lejos. Y si tiene un analista de seguridad en su equipo, no dude en comunicarse con él para revisar el código.

A pesar de todo lo que se habla de que la IA reemplazará a los humanos, todavía hemos llegado a ese punto, no en este campo. Pero esa no es una discusión que me gustaría tener ahora. Al menos, usar herramientas de inteligencia artificial como GitHub Copilot y ChatGPT para ayudar a proteger el código fuente no es una mala idea, pero no es la mejor idea y no reemplaza a alguien que esté en su equipo. La IA estará realmente limitada por su conocimiento contextual del entorno y las limitaciones del sistema.

En todo caso, quizás sean asistentes de código y nada más.



Tom McFarlin

Comments

comments

RELACIONADOS