¿Cómo se genera el nonce de WordPress?

0

Estoy intentando reproducir el parámetro "nonce" de wordpress. ¿Cómo se genera? ¿Cómo se relaciona con las cookies?

De codex.wordpress.com :

  

Los nonces se generan mediante una clave y sal que son exclusivos de su sitio   Si has instalado WordPress correctamente. NONCE_KEY y NONCE_SALT   se definen en su archivo wp-config.php, y el archivo contiene comentarios   que proporcionan más información.

Y así salgo ( default-constants.php ):

function wp_cookie_constants() {
    /**
     * Used to guarantee unique hash cookies
     *
     * @since 1.5.0
     */
    if ( !defined( 'COOKIEHASH' ) ) {
        $siteurl = get_site_option( 'siteurl' );
        if ( $siteurl )
            define( 'COOKIEHASH', md5( $siteurl ) );
        else
            define( 'COOKIEHASH', '' );
    }

    /**
     * @since 2.0.0
     */
    if ( !defined('USER_COOKIE') )
        define('USER_COOKIE', 'wordpressuser_' . COOKIEHASH);

    /**
     * @since 2.0.0
     */
    if ( !defined('PASS_COOKIE') )
        define('PASS_COOKIE', 'wordpresspass_' . COOKIEHASH);

    /**
     * @since 2.5.0
     */
    if ( !defined('AUTH_COOKIE') )
        define('AUTH_COOKIE', 'wordpress_' . COOKIEHASH);

    /**
     * @since 2.6.0
     */
    if ( !defined('SECURE_AUTH_COOKIE') )
        define('SECURE_AUTH_COOKIE', 'wordpress_sec_' . COOKIEHASH);

    /**
     * @since 2.6.0
     */
    if ( !defined('LOGGED_IN_COOKIE') )
        define('LOGGED_IN_COOKIE', 'wordpress_logged_in_' . COOKIEHASH);

    /**
     * @since 2.3.0
     */
    if ( !defined('TEST_COOKIE') )
        define('TEST_COOKIE', 'wordpress_test_cookie');

    /**
     * @since 1.2.0
     */
    if ( !defined('COOKIEPATH') )
        define('COOKIEPATH', preg_replace('|https?://[^/]+|i', '', get_option('home') . '/' ) );

    /**
     * @since 1.5.0
     */
    if ( !defined('SITECOOKIEPATH') )
        define('SITECOOKIEPATH', preg_replace('|https?://[^/]+|i', '', get_option('siteurl') . '/' ) );

    /**
     * @since 2.6.0
     */
    if ( !defined('ADMIN_COOKIE_PATH') )
        define( 'ADMIN_COOKIE_PATH', SITECOOKIEPATH . 'wp-admin' );

    /**
     * @since 2.6.0
     */
    if ( !defined('PLUGINS_COOKIE_PATH') )
        define( 'PLUGINS_COOKIE_PATH', preg_replace('|https?://[^/]+|i', '', WP_PLUGIN_URL)  );

    /**
     * @since 2.0.0
     */
    if ( !defined('COOKIE_DOMAIN') )
        define('COOKIE_DOMAIN', false);
}
    
pregunta Robert Beran 22.05.2018 - 22:17
fuente

1 respuesta

2

Para averiguarlo, mira el código fuente de WP.

La función wp_create_nonce se genera en pluggable.php . El trato real es este:

substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 )

Donde:

  • $i es una forma de marca de tiempo (aumenta en uno en un intervalo de tiempo fijo, y un nonce tiene una vida útil de dos de tales intervalos).
  • $action especifica para qué acción es el nonce (predeterminado en -1).
  • $uid es el ID de usuario (se aplican reglas especiales si el usuario está desconectado).
  • $token es el ID de sesión para la sesión actual.

Mirando de cerca la función wp_hash (ubicada en el mismo archivo), encontramos esto:

function wp_hash( $data, $scheme = 'auth' ) {
    $salt = wp_salt( $scheme );
    return hash_hmac( 'md5', $data, $salt );
}

Así que es un MD5 HMAC. La función hash_hmac es una función central de PHP. La variable que por alguna razón se llama $salt es la clave HMAC.

Entonces, ¿qué es el $salt ? Es evidente que depende de $scheme que es "nonce" en nuestro caso. Para obtener más información, consulte la función wp_salt . En los comentarios, encontrarás esto:

  

Las sales se crean utilizando claves secretas. Las claves secretas se encuentran en dos lugares: en la base de datos y en el archivo wp-config.php . La clave secreta en la base de datos se genera aleatoriamente y se agregará a las claves secretas en wp-config.php .

Para obtener más detalles sobre dónde leer exactamente las teclas, consulte el código real. Por lo que puedo decir, no tiene relación alguna con las cookies.

TL; DR: El nonce es un HMAC MD5 de una marca de tiempo, la acción, la identificación del usuario y la identificación de la sesión, con los secretos almacenados en wp-config.php y la base de datos.

    
respondido por el Anders 23.05.2018 - 14:45
fuente

Lea otras preguntas en las etiquetas