Come viene generato il nonce di WordPress?

0

Sto provando a riprodurre il parametro "nonce" wordpress. Come viene generato? In che modo è correlato ai cookie?

Da codex.wordpress.com :

Nonces are generated using a key and salt that are unique to your site if you have installed WordPress correctly. NONCE_KEY and NONCE_SALT are defined in your wp-config.php file, and the file contains comments that provide more information.

E così esco ( 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);
}
    
posta Robert Beran 22.05.2018 - 22:17
fonte

1 risposta

2

Per scoprirlo, guarda il codice sorgente di WP.

Gli eventi non vengono generati dalla funzione wp_create_nonce in pluggable.php . Il vero affare è questo:

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

Dove:

  • $i è una forma di timestamp (aumenta di uno in un intervallo di tempo fisso e un nonce ha una durata di due di tali intervalli).
  • $action specifica quale azione è il nonce (valore predefinito -1).
  • $uid è l'ID utente (si applicano regole speciali se l'utente è disconnesso).
  • $token è l'ID di sessione per la sessione corrente.

Osservando più da vicino la funzione wp_hash (situata nello stesso file), troviamo in questo modo:

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

Quindi è un HMAC MD5. La funzione hash_hmac è una funzione core PHP. La variabile che per qualche motivo si chiama $salt è la chiave HMAC.

Quindi cos'è $salt ? Chiaramente dipende dal $scheme che è "nonce" nel nostro caso. Per ulteriori informazioni, consulta la funzione wp_salt . Nei commenti, troverai questo:

Salts are created using secret keys. Secret keys are located in two places: in the database and in the wp-config.php file. The secret key in the database is randomly generated and will be appended to the secret keys in wp-config.php.

Per maggiori dettagli su esattamente dove legge i tasti, vedere il codice attuale. Per quanto posso dire, non è completamente correlato a nessun cookie.

TL; DR: il nonce è un MDM HMAC di un timestamp, l'azione, l'id utente e l'id di sessione, con chiave memorizzata in wp-config.php e nel database.

    
risposta data 23.05.2018 - 14:45
fonte

Leggi altre domande sui tag