以编程方式提交 WordPress 表单密码

Posted

技术标签:

【中文标题】以编程方式提交 WordPress 表单密码【英文标题】:Submit WordPress form password programmatically 【发布时间】:2011-02-06 19:42:39 【问题描述】:

如何让用户访问受 WordPress 保护的页面,其 URL 将在下面的表单中提交密码?

我希望能够让用户无需输入密码即可访问受密码保护的 WordPress 页面,因此当他们访问该页面时,密码是通过页面加载时的 POST URL 提交的。

这在任何方面都不是安全的;我需要在 URL 和 php 中对密码进行硬编码。这只是为了方便用户。

编辑 4/19/10: 根据下面的答案,可以直接设置 cookie 以允许用户不必输入密码。最好通过检测用户代理和重定向来让搜索机器人进入,因为机器人不会处理 cookie。

这是表单(这是 WordPress 核心代码):

<form action="http://mydomain.com/wp-pass.php" method="post">

Password: <input name="post_password" type="password" size="20" />

<input type="submit" name="Submit" value="Submit" /></form>

这是 wp-pass.php(这是 WordPress 核心代码):

<?php
require( dirname(__FILE__) . '/wp-load.php');

if ( get_magic_quotes_gpc() )
    $_POST['post_password'] = stripslashes($_POST['post_password']);

setcookie('wp-postpass_' . COOKIEHASH, $_POST['post_password'], time() + 864000, COOKIEPATH);

wp_safe_redirect(wp_get_referer());
?>

【问题讨论】:

【参考方案1】:

我将尝试在此处进一步解释该问题,而不是继续附加上一个答案。

Wordpress 密码的工作方式是:

    原始页面有一个表单,其中 已发送至wp-pass.phpwp-pass.php 接受提供的 密码,把它放在一个cookie中,然后 将用户重定向回 原始页面。 原始页面检查cookie 如果密码正确,它 将显示该页面。

这里的问题是搜索引擎不接受 cookie。所以,你有两个选择:

    将 Wordpress 用于密码内容的代码更改为也接受 $_GET 变量的代码。 使用 cURL 发送 cookie 使用 headers,有单独的页面搜索引擎可以使用。

如果您愿意,我很乐意扩展后一个答案,但我确实想知道;如果您要让搜索引擎访问密码内容,那么任何人都可以访问。为什么不直接删除密码?

【讨论】:

感谢您的所有帮助。我现在正在研究只是将搜索引擎重定向到不同的页面。但是随后该页面将被编入索引,因此我需要找到一种方法来阻止或重定向非搜索引擎流量,使其远离该页面并返回原始页面。是的,这是一种奇怪的做事方式,但我想开始工作。 我还想问你为什么要这个吗?通过将其编入索引,任何人都可以通过该搜索引擎查看内容。那么有密码有什么意义呢? 实际上,现在我想我希望搜索引擎为该页面编制索引,但随后来自该搜索链接的非 googlebot 流量被重定向到介绍性页面,而不是受密码保护的页面。我可以使用 php 来选择 googlebot 流量以查看页面(并将其编入索引),但非 googlebot 流量可能会将 http 重定向到介绍页面,在该页面中,用户在看到介绍后会通过 ajax 切换内容? 这应该可以工作:if(strpos($_SERVER['HTTP_USER_AGENT'], "Googlebot") === false) header("Location: http://mydomain.com/intro.php"); 这将检查 UA 字符串中的 Googlebot,如果未找到重定向到 mydomain.com/intro.php。 我正在使用重定向,但您的代码更好。我认为这是要走的路。如果我可以检查一系列 google、bing 和 yahoo 并忘记其他机器人,那就太好了。感谢你的帮助。 cURL 和 cookie 的想法也适用于其他事情。【参考方案2】:

在 wp-pass.php 中将 $_POST 更改为 $_REQUEST。

该代码仅查看 POST 变量,而不是 URL 中的 GET 变量。 REQUEST 全局包含 POST 和 GET 变量,这正是您想要的。

可能有更好的方法,但我不知道 WordPress。

编辑

问题是这些参数在 GET 数组中,而不是 POST 数组中。因此,使用带有参数的常规链接是行不通的。您可以使用带有隐藏字段的表单。如果需要,您可以设置提交按钮的样式,使其看起来像一个链接。

<form action="http://mydomain.com/wp-pass.php" method="post">
<input name="post_password" type="hidden" value="totally insecure password here" />
<input type="submit" name="Submit" value="Click here to enter your account" />
</form>

【讨论】:

出于功能和升级原因,破解核心 Wordpress 文件不是一个好主意。此外,如果我更改 wp-pass.php,那么 Wordpress 中的所有密码功能都会中断。我宁愿使用内置的 wp-pass 函数,也不愿用另一个文件或版本替换它。 实际上,您可能不会破坏任何东西。 REQUEST 包含 POST 和 GET 变量,并且 POST 变量会覆盖 GET 变量(除非您在 PHP.ini 中更改了 variables_order)。我将更新我的帖子以解释另一种解决方案。【参考方案3】:

如果你想在不编辑 WP 内核的情况下这样做,你可以使用 cURL 来模拟 POST 变量,如下所示:

$ch = curl_init("http://mydomain.com/wp-pass.php");
curl_setopt($ch, CURLOPT_POSTFIELDS,  "post_password=mypassword&Submit=Submit");  
curl_setopt($ch, CURLOPT_HEADER, 0);  
curl_setopt($ch, CURLOPT_POST, 1);  
curl_exec($ch);  
curl_close($ch);

【讨论】:

用 curl 解决表单的好主意,但仍然没有运气。我想知道我的查询字符串是否错误,或者我是否需要引用? 好吧,再看代码,我想你只需要使用cookie访问原始页面(不是wp-pass.php)。 嗯...如果我访问原始页面,curl 函数会在不提交密码字符串的情况下重新加载页面。 wp-pass.php设置的cookie我不需要,可以忽略。 你需要wp-pass.php设置的cookie,不能忽略。 wp-pass.php 所做的只是设置 cookie 并重定向到原始页面。不多也不少。所以,如果你只是用你使用的任何页面设置cookie,你可以绕过wp-pass.php。使用setcookie('wp-postpass_' . COOKIEHASH, "mypassword", time() + 864000, COOKIEPATH); 绕过 wp-pass 的好主意,但是当我尝试直接设置 cookie 时,我得到了可怕的“标头已发送”错误。 javascript会设置cookie吗?但我的最终目标是允许搜索机器人进入密码页面,以便对内容进行索引,我认为机器人不接受 cookie。【参考方案4】:

在this answer的评论中:

其实,现在我想搜索 引擎索引页面,但随后 来自该搜索的非 googlebot 流量 链接被重定向到 介绍页面,不是密码 受保护的页面。我可以使用 php 来 选择 googlebot 流量以查看 页面(并将其编入索引),但非 googlebot 流量可以得到一个 http 重定向到 内容所在的介绍页面 用户在看到后通过 ajax 切换 简介?

小心这种做法。搜索引擎可以将其解释为Cloaking。

Cloaking 是一个黑帽搜索引擎 优化(SEO)技术,其中 呈现给搜索的内容 引擎蜘蛛与此不同 呈现给用户的浏览器。

我并不是说他们会自动知道您正在这样做,也许他们永远不会知道。但了解所涉及的风险很有趣。

我想知道您对这种做法的意图,以了解是否有其他替代方案适合您的需求。

【讨论】:

【参考方案5】:

首先我不知道搜索引擎对 javascript 的反应如何,但这样的东西可以工作吗?

致电mydomain.com/wp-pass.php?post_password=mypassword&amp;Submit=Submit

添加这2个js函数:

function gup( name )  
 name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");  
 var regexS = "[\\?&]"+name+"=([^&#]*)";  var regex = new RegExp( regexS );  
 var results = regex.exec( window.location.href );  
 if( results == null )    
  return "";  
 else    
  return results[1];


function setPassword()


 var password = gup('post_password');
 var passField = document.getElementByName('post_password');
 var buttonSubmit = document.getElementByName('Submit');

 if(password != "")
 
  passField.value = password;
  buttonSubmit.Click();
 


添加到正文标签,OnLoad="setPassword();"

我不知道机器人对此有何反应...

【讨论】:

【参考方案6】:

我认为之前的答案比他们需要的要复杂得多。

如果每个人都可以阅读该页面,请不要使用密码保护它。这是迄今为止最简洁的解决方案。如果每个人和他的狗都可以阅读该页面,密码是多少?

如果您确实觉得需要使用 POST 来创建链接,那么可以这样做:

(对不起,如果这个背景是多余的,但从你的问题看来,值得一提的是:HTTP 支持 URL 上的各种方法;POST 开启,GET 是另一种。当你正常获取一个 url 时,就像 元素,您正在使用 GET 方法。)

我同意修改核心文件以将 $_POST 替换为 $_REQUEST 是不必要的。你想要的是一个使用 POST 方法的链接元素。为此,请制作一个简单的表格,如下所示:

<form action="your url" method="POST">
    <input type="hidden" value="my_password" name="password"/>
    <input type="submit" value="Submit" name="submit">
</form>

你可以添加 style="border: 0; background: transparent;"依此类推到第二个输入,如果你愿意,让它看起来像一个正常的链接。这有点麻烦,但只要您需要使用 POST 方法发送链接,它就可以正常工作。

PS。使用 Wireshark 检查 POST 变量非常浪费时间。安装 Firebug FF 扩展并使用网络面板。它将大大加快处理这些事情的速度。

【讨论】:

然而,这并不能解决搜索引擎能够访问它们的问题。如果不修改核心文件,您将不需要 cookie。因此,没有像 cURL 这样的东西是不可能的,这只是太过分了。而且,这正是马特所说的。

以上是关于以编程方式提交 WordPress 表单密码的主要内容,如果未能解决你的问题,请参考以下文章

无法以编程方式提交表单[重复]

Angular - 以编程方式提交表单

Wordpress 登录表单验证

如何在 WebBrowser 中以编程方式提交没有提交按钮的表单

如何以编程方式提交Blazor表单?

使用 AjaxForm 时以编程方式提交表单