如何让用户使用可在下面的表单中提交密码的URL访问受WordPress保护的页面?
我希望能够让用户访问受密码保护的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());
?>
答案 0 :(得分:4)
我会尝试在此处进一步解释这个问题,而不是继续添加到上一个答案中。
Wordpress passwording的工作方式是:
wp-pass.php
。wp-pass.php
获取提供的内容
密码,将其放入cookie中
将用户重定向回来
原始页面。问题在于搜索引擎不接受cookie。所以,你有两个选择:
$_GET
个变量的内容。答案 1 :(得分:1)
在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>
答案 2 :(得分:1)
如果你想在不编辑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);
答案 3 :(得分:1)
在this answer的评论中:
实际上,现在我觉得我想搜索 引擎来索引页面,但随后 来自该搜索的非googlebot 流量 链接被重定向到 介绍页面,而不是密码 受保护的页面我可以使用PHP来 选择googlebot流量即可查看 页面(并索引它),但非googlebot 流量可以获得http重定向 内容所在的介绍页面 用户看到后被ajax切换 介绍?
请注意这种做法。搜索引擎可以将其解释为Cloaking。
隐藏真实内容是一个黑帽搜索引擎 优化(SEO)技术 提交给搜索的内容 引擎蜘蛛与此不同 呈现给用户的浏览器。
我并不是说他们会自动知道你在做这件事,也许他们永远都不会。但了解所涉及的风险很有意思。
我想知道您对此做法的意图,以了解是否有其他替代方案符合您的需求。
答案 4 :(得分:0)
首先,我不知道搜索引擎如何对javascript做出反应,但这样的工作可能会有效吗?
致电mydomain.com/wp-pass.php?post_password=mypassword&Submit=Submit
添加这两个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();"
我不知道机器人对此的反应......
答案 5 :(得分:-1)
我认为以前的答案比他们需要的更复杂。
如果每个人都可以阅读该页面,请不要用密码保护它。这是迄今为止最巧妙的解决方案。如果每个人和他的狗都可以阅读该页面的密码是什么?
如果你真的觉得需要建立一个使用POST的链接,可以采用以下方法:
(很抱歉,如果这个背景是多余的,但似乎从你的问题来看,值得一提:HTTP支持URL的各种方法; POST打开,GET是另一个。当你正常获取网址时,就像&lt; a&gt;元素,您正在使用GET方法。)
我同意修改核心文件以用$ _REQUEST替换$ _POST是不必要的。你想要的是一个使用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扩展并使用网络面板。它将大大加快这些事情的发展。