Как использовать функцию WP_SALT() для обеспечения безопасности │ WP 2.5.0

WP_SALT() │ WP 2.5.0

Функция WP_SALT() используется для получения соли, которую добавляют к хэшам.

Что такое соль?

Соли создаются с помощью секретных ключей. Эти ключи находятся в двух местах: в базе данных и в файле wp-config.php. Секретный ключ в базе данных генерируется случайным образом и добавляется к секретным ключам в wp-config.php.

Для по��ышения безопасности секретные ключи в файле wp-config.php следует настроить на сильные, случайные ключи. Ниже приведен пример того, как определяются эти ключи. Не вставляйте этот пример прямо в wp-config.php, лучше воспользуйтесь генератором секретных ключей, который создаст их специально для вас.

define('AUTH_KEY',         'XakmM%G4Yt>f`z]MON');
define('SECURE_AUTH_KEY',  'LzJ}op]mr|6+![P}Ak:uNdJCJZd>(Hx.-Mh#Tz)pCIU#uGEnfFz|f ;;eU%/U^O~');
define('LOGGED_IN_KEY',    '|i|Ux`9z7X>QYR0Z_XnZ@|');
define('AUTH_SALT',        'eZyT)-Naw]F8CwA*VaW#q*|.)g@o}||wf~@C-YSt}(dh_r6EbI#A,y|nU2{B#JBW');
define('SECURE_AUTH_SALT', '!=oLUTXh,QW=H }L|9/^4-3 STz},T(w}W*c(u`g~EJBf#8u#R{mUEZrozmm');
define('NONCE_SALT',       'hGXHhD>SLWVfg1(1(N{;.V!MoE(SfbA_ksP@&+AycHcAV$+?@3q+rxV{%^VyKT');

Соль для паролей помогает защититься от инструментов, которые хранят хэшированные значения популярных слов из словаря. Добавление соли усложняет взлом паролей.

Замещаемая функция

Функция wp_salt() является замещаемой, что означает, что её можно переопределить в плагинах. Это значит, что функция работает только после загрузки всех плагинов. До этой точки функция не определена, и вы не можете вызывать её напрямую из кода плагина. Вызов следует делать на хуке plugins_loaded или позже, например на хуке init.

Переопределение функции

В плагинах (как обязательных, так и обычных) вы можете создать функцию с тем же именем, и она заменит оригинальную функцию.

Использование функции

wp_salt( $scheme );

Параметры

  • $scheme (строка): Схема аутентификации (auth, secure_auth, logged_in, nonce). По умолчанию: 'auth'

Примеры использования

$salt = wp_salt('logged_in');
echo $salt;

Вывод будет похож на следующий:

0D3*SIMO4$(t~I;E]NBx}LVy2U8o|{vbxH4t3l-!4-Io N(U74&+BdC^S,~*0^B>k,|4/76[PG|V:)}o$)!hh1GgZ>t8[A-rmF&RDU~|fcN1/]T7i/=H

Обновления

  • С версии 2.5.0: Функция была введена.

Код функции wp_salt()

function wp_salt( $scheme = 'auth' ) {
    static $cached_salts = array();
    if ( isset( $cached_salts[ $scheme ] ) ) {
        // Фильтруем значение соли
        return apply_filters( 'salt', $cached_salts[ $scheme ], $scheme );
    }

    static $duplicated_keys;
    if ( null === $duplicated_keys ) {
        $duplicated_keys = array();

        // Определяем дубликаты ключей
        foreach ( array( 'AUTH', 'SECURE_AUTH', 'LOGGED_IN', 'NONCE', 'SECRET' ) as $first ) {
            foreach ( array( 'KEY', 'SALT' ) as $second ) {
                if ( ! defined( "{$first}_{$second}" ) ) {
                    continue;
                }
                $value                     = constant( "{$first}_{$second}" );
                $duplicated_keys[ $value ] = isset( $duplicated_keys[ $value ] );
            }
        }

        $duplicated_keys['put your unique phrase here'] = true;
        $duplicated_keys[ __( 'put your unique phrase here' ) ] = true;
    }

    // Определяем, какие опции необходимо подготовить
    $options_to_prime = array();
    foreach ( array( 'auth', 'secure_auth', 'logged_in', 'nonce' ) as $key ) {
        foreach ( array( 'key', 'salt' ) as $second ) {
            $const = strtoupper( "{$key}_{$second}" );
            if ( ! defined( $const ) || true === $duplicated_keys[ constant( $const ) ] ) {
                $options_to_prime[] = "{$key}_{$second}";
            }
        }
    }

    if ( ! empty( $options_to_prime ) ) {
        $options_to_prime[] = 'secret_key';
        wp_prime_site_option_caches( $options_to_prime );
    }

    $values = array(
        'key'  => '',
        'salt' => '',
    );
    if ( defined( 'SECRET_KEY' ) && SECRET_KEY && empty( $duplicated_keys[ SECRET_KEY ] ) ) {
        $values['key'] = SECRET_KEY;
    }
    if ( 'auth' === $scheme && defined( 'SECRET_SALT' ) && SECRET_SALT && empty( $duplicated_keys[ SECRET_SALT ] ) ) {
        $values['salt'] = SECRET_SALT;
    }

    if ( in_array( $scheme, array( 'auth', 'secure_auth', 'logged_in', 'nonce' ), true ) ) {
        foreach ( array( 'key', 'salt' ) as $type ) {
            $const = strtoupper( "{$scheme}_{$type}" );
            if ( defined( $const ) && constant( $const ) && empty( $duplicated_keys[ constant( $const ) ] ) ) {
                $values[ $type ] = constant( $const );
            } elseif ( ! $values[ $type ] ) {
                $values[ $type ] = get_site_option( "{$scheme}_{$type}" );
                if ( ! $values[ $type ] ) {
                    $values[ $type ] = wp_generate_password( 64, true, true );
                    update_site_option( "{$scheme}_{$type}", $values[ $type ] );
                }
            }
        }
    } else {
        if ( ! $values['key'] ) {
            $values['key'] = get_site_option( 'secret_key' );
            if ( ! $values['key'] ) {
                $values['key'] = wp_generate_password( 64, true, true );
                update_site_option( 'secret_key', $values['key'] );
            }
        }
        $values['salt'] = hash_hmac( 'md5', $scheme, $values['key'] );
    }

    $cached_salts[ $scheme ] = $values['key'] . $values['salt'];

    /** Этот фильтр задокументирован в wp-includes/pluggable.php */
    return apply_filters( 'salt', $cached_salts[ $scheme ], $scheme );
}

Связанные функции

  • Проверка безопасности
    • check_admin_referer()
    • check_ajax_referer()
    • sanitize_url()
    • wp_create_nonce()
    • wp_generate_password()
    • wp_hash()
    • wp_hash_password()
    • wp_http_validate_url()
    • wp_kses_post()
    • wp_nonce_ays()
    • wp_nonce_field()
    • wp_nonce_url()
    • wp_referer_field()
    • wp_sanitize_redirect()
    • wp_verify_nonce()

Эта структура и объяснения помогут вам лучше понять, как работает функция WP_SALT() и почему она важна для безопасности вашего сайта на WordPress.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *