Lumpuhkan WP REST API dengan selamat
P粉463811100
P粉463811100 2024-01-10 16:27:31
0
2
506

Saya sedang mengkaji untuk meningkatkan keselamatan tapak Wordpress saya dan semasa berbuat demikian mendapati bahawa API WP REST didayakan secara lalai (setakat WP 4.4 jika saya ingat dengan betul).

Apakah cara selamat untuk melumpuhkannya?

"Selamat" di sini bermakna ia tidak akan menyebabkan kesan sampingan yang tidak diingini, seperti tidak memecahkan sebarang fungsi teras WP yang lain.

Satu cara yang mungkin ialah menggunakan .htaccess untuk menulis semula peraturan, tetapi yang menghairankan saya tidak menemui sebarang arahan "rasmi" untuk melakukan ini.

Sebarang bantuan atau nasihat amat kami hargai :)

Kemas kini: Pemalam pihak ketiga bukanlah penyelesaian yang saya cari. Walaupun saya tahu terdapat banyak alat yang boleh menyelesaikan tugasan ini, ia mengandungi banyak ciri tambahan yang boleh melambatkan tapak web. Saya berharap ada penyelesaian satu baris untuk masalah ini tanpa overhed tambahan pemalam.

Kemas kini 2: Ini ialah pendapat rasmi WordPress: https://developer.wordpress.org/rest-api/using-the-rest-api/frequently-asked-questions/#can-i-disable-the-rest-api

Menurut ini, pasukan WordPress berharap ciri WP masa hadapan akan bergantung pada API REST baharu. Ini bermakna tiada cara selamat untuk melumpuhkan API REST.

Kami hanya berharap terdapat cukup pakar keselamatan yang bertanggungjawab untuk keselamatan WP.

Kemas kini 3:

Terdapat penyelesaian yang tersedia dalam manual API WordPress - anda boleh memerlukan pengesahan untuk semua permintaan

Ini memastikan bahawa akses tanpa nama ke API REST tapak web dilumpuhkan dan hanya permintaan yang disahkan adalah sah.

P粉463811100
P粉463811100

membalas semua(2)
P粉478445671

Jawapan yang diterima melumpuhkan semua panggilan API untuk pengguna yang tidak disahkan, tetapi banyak pemalam hari ini bergantung pada fungsi API ini.

Melumpuhkan semua panggilan akan mengakibatkan tingkah laku tapak web yang tidak dijangka, yang juga berlaku kepada saya apabila menggunakan kod ini.

Sebagai contoh, ContactForm7 menggunakan API ini untuk menghantar maklumat hubungan ke pangkalan data (saya rasa) dan melakukan pengesahan ReCaptcha.

Saya rasa lebih baik untuk melumpuhkan titik akhir (lalai) tertentu untuk pengguna yang tidak disahkan, seperti ini:

// Disable some endpoints for unauthenticated users
add_filter( 'rest_endpoints', 'disable_default_endpoints' );
function disable_default_endpoints( $endpoints ) {
    $endpoints_to_remove = array(
        '/oembed/1.0',
        '/wp/v2',
        '/wp/v2/media',
        '/wp/v2/types',
        '/wp/v2/statuses',
        '/wp/v2/taxonomies',
        '/wp/v2/tags',
        '/wp/v2/users',
        '/wp/v2/comments',
        '/wp/v2/settings',
        '/wp/v2/themes',
        '/wp/v2/blocks',
        '/wp/v2/oembed',
        '/wp/v2/posts',
        '/wp/v2/pages',
        '/wp/v2/block-renderer',
        '/wp/v2/search',
        '/wp/v2/categories'
    );

    if ( ! is_user_logged_in() ) {
        foreach ( $endpoints_to_remove as $rem_endpoint ) {
            // $base_endpoint = "/wp/v2/{$rem_endpoint}";
            foreach ( $endpoints as $maybe_endpoint => $object ) {
                if ( stripos( $maybe_endpoint, $rem_endpoint ) !== false ) {
                    unset( $endpoints[ $maybe_endpoint ] );
                }
            }
        }
    }
    return $endpoints;
}

Dengan cara ini, satu-satunya titik akhir yang dibuka sekarang ialah titik yang dipasang oleh pemalam.

Untuk senarai lengkap titik akhir yang aktif di tapak anda, lihat https://YOURSITE.com/wp-json/

Anda bebas untuk mengedit tatasusunan $endpoints_to_remove mengikut keperluan anda.

Jika anda mempunyai jenis siaran tersuai, pastikan anda menambahkan kesemuanya pada senarai.

Dalam kes saya, Saya turut menukar awalan titik akhir lalai daripada wp-json 更改为 mybrand-api. Ini sepatutnya bertindak sebagai penghalang kepada bot yang membuat beribu-ribu permintaan kekerasan.

Ini yang saya lakukan:

// Custom rest api prefix (Make sure to go to Dashboard > Settings > Permalinks and press Save button to flush/rewrite url cache )
add_filter( 'rest_url_prefix', 'rest_api_url_prefix' );
function rest_api_url_prefix() {
    return 'mybrand-api';
}
P粉512363233

Berdasarkan soalan asal pengarang, saya memilih pilihan 2 daripada cadangan WordPress rasmi (https://developer.wordpress.org/rest-api/using-the-rest-api/frequently-asked-questions/#can- i-disable-the-rest-api). Jadi masukkan sahaja functions.php anda dan hanya biarkan pengguna log masuk menggunakan API yang lain (tetapi semak semak pautan asal sekiranya blok kod saya sudah lapuk ;) ): Kemas kini (1 Oktober 2021):

add_filter( 'rest_authentication_errors', function( $result ) {
    // If a previous authentication check was applied,
    // pass that result along without modification.
    if ( true === $result || is_wp_error( $result ) ) {
        return $result;
    }

    // No authentication has been performed yet.
    // Return an error if user is not logged in.
    if ( ! is_user_logged_in() ) {
        return new WP_Error(
            'rest_not_logged_in',
            __( 'You are not currently logged in.' ),
            array( 'status' => 401 )
        );
    }

    // Our custom authentication check should have no effect
    // on logged-in requests
    return $result;
});
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan