fix(admin): 13 個破壞性動作由 GET 改 POST + nonce(A1-A4)
nonce 走 query string 會經 Referer 外洩,且 GET 觸發的破壞性動作(刪快照、 cutover、promote aeav_only、清 postmeta)可被 prefetch/爬蟲觸發。對應 A v3.3.1 P1-6。 Handler 端(admin/class-tmdo-admin.php:300-700):13 個動作與其附屬參數 (post_type / count / mode / samples)全部改讀 $_POST。唯讀的 tab / classify_type / wpdo_msg / wpdo_module 維持 GET。 渲染端改為 <form method=post> + wp_nonce_field(): - admin:重置速率統計、建立/清除快照、刪除快照、啟用 module - dashboard-widget:跑健康檢查、建立快照、一鍵清理 postmeta - post-migration-wizard:5 個步驟動作 - setup-wizard:建立 baseline snapshot - post-stress-test:移除已無呼叫端的 legacy GET $cleanup_url 註:A 的 dashboard-widget 仍以 wp_nonce_url 產生 postmeta_cleanup 連結, 但其 handler 已只收 POST → 該按鈕在 A 是壞的;B 這邊一併改成 form。 unit 379 / integration 398 GREEN Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TbG1keQQ7XBa7qMQY16KCY
This commit is contained in:
@@ -343,15 +343,18 @@ class TMDO_Setup_Wizard {
|
||||
<p style="color: #46b450; font-weight: bold;">✅ <?php esc_html_e( '快照已建立。可隨時於「備份快照」tab 查看與管理。', '2meet-data-optimizer' ); ?></p>
|
||||
<?php else : ?>
|
||||
<p><?php esc_html_e( '我們會建立一個 baseline snapshot,命名為 wizard_baseline,保留 365 天。即使你日後沒做任何 destructive 操作,這也是一個 known-good 還原點。', '2meet-data-optimizer' ); ?></p>
|
||||
<p>
|
||||
<a class="button button-secondary"
|
||||
href="<?php echo esc_url( wp_nonce_url( admin_url( 'tools.php?page=wpdo-setup-wizard&step=4&action=take_snapshot' ), self::NONCE_NAME ) ); ?>">
|
||||
<?php esc_html_e( '建立 baseline snapshot', '2meet-data-optimizer' ); ?>
|
||||
</a>
|
||||
</p>
|
||||
<form method="post" action="<?php echo esc_url( admin_url( 'tools.php?page=wpdo-setup-wizard&step=4' ) ); ?>" style="display:inline">
|
||||
<?php wp_nonce_field( self::NONCE_NAME ); ?>
|
||||
<input type="hidden" name="wpdo_take_snapshot" value="1">
|
||||
<p>
|
||||
<button type="submit" class="button button-secondary">
|
||||
<?php esc_html_e( '建立 baseline snapshot', '2meet-data-optimizer' ); ?>
|
||||
</button>
|
||||
</p>
|
||||
</form>
|
||||
<?php
|
||||
// Take snapshot if action requested.
|
||||
if ( isset( $_GET['action'] ) && 'take_snapshot' === $_GET['action'] && check_admin_referer( self::NONCE_NAME ) && class_exists( 'TMDO_Snapshot_Manager' ) ) {
|
||||
// Take snapshot if action requested (POST + nonce, prevents Referer leak — v3.3.x P1-6b hardening).
|
||||
if ( isset( $_POST['wpdo_take_snapshot'] ) && check_admin_referer( self::NONCE_NAME ) && class_exists( 'TMDO_Snapshot_Manager' ) ) {
|
||||
$result = TMDO_Snapshot_Manager::create(
|
||||
'manual',
|
||||
array(),
|
||||
|
||||
Reference in New Issue
Block a user