使用Invoke-WebRequest登录无表单WordPress密码页失败求助
解决方案
针对WordPress仅密码保护页面的登录问题,可通过以下修改解决:
修正后的代码
$baseUrl = "https://www.mypage.com" $protectedPage = "$baseUrl/internal" $loginEndpoint = "$baseUrl/wp-login.php?action=postpass" # 初始化会话,获取页面初始Cookie $initialRequest = Invoke-WebRequest -Uri $protectedPage -SessionVariable MySession -Method Get # 构造与浏览器完全匹配的请求体 $body = @{ post_password = "你的密码" Submit = "Enter" } # 发送POST登录请求,明确指定表单编码类型 $loginRequest = Invoke-WebRequest -Uri $loginEndpoint -WebSession $MySession -Body $body -Method Post ` -ContentType "application/x-www-form-urlencoded" -MaximumRedirection 0 # 访问受保护页面,禁用系统凭据强制使用会话Cookie $pageContents = Invoke-WebRequest -Uri $protectedPage -WebSession $MySession -Method Get
关键修改说明
- 移除
-UseDefaultCredentials参数:该参数会强制使用当前Windows用户凭据,覆盖会话中保存的登录Cookie,直接导致会话失效。 - 显式指定
-ContentType:虽然PowerShell会自动转换哈希表为表单编码,但明确设置application/x-www-form-urlencoded可避免编码不匹配,确保与浏览器请求完全一致。 - 禁用自动重定向(
-MaximumRedirection 0):WordPress的postpass验证返回302重定向时,自动跟随可能导致会话Cookie未正确留存,禁用后可直接通过会话Cookie访问目标页面。 - 统一会话变量:所有请求必须复用同一个
$MySession,保证登录后的Cookie在请求间正确传递。
额外排查点
- 检查浏览器中提交的
Submit参数名是否为小写submit(部分WordPress主题可能使用小写命名),若不一致需同步修改Body中的键名。 - 查看
$loginRequest.Headers["Set-Cookie"],确认是否包含wp-postpass_开头的Cookie,存在则说明登录验证已生效。
内容的提问来源于stack exchange,提问作者Tanaka Saito
相关产品推荐
相关产品推荐

