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

时间:2010-04-11 22:53:16

标签: php wordpress url forms post

如何让用户使用可在下面的表单中提交密码的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());
?>

6 个答案:

答案 0 :(得分:4)

我会尝试在此处进一步解释这个问题,而不是继续添加到上一个答案中。

Wordpress passwording的工作方式是:

  1. 原始页面有一个表单,其中 被发送到wp-pass.php
  2. wp-pass.php获取提供的内容 密码,将其放入cookie中 将用户重定向回来 原始页面。
  3. 原始页面会检查Cookie 如果密码正确,它 将显示该页面。
  4. 问题在于搜索引擎不接受cookie。所以,你有两个选择:

    1. 将Wordpress用于密码内容的代码更改为也接受$_GET个变量的内容。
    2. 使用cURL使用标题发送cookie,具有单独的页面搜索引擎可以使用。
    3. 如果你愿意的话,我很想扩展后一个答案,但我确实很想知道;如果您要让搜索引擎访问密码内容,任何人都可以访问。为什么不删除密码?

答案 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扩展并使用网络面板。它将大大加快这些事情的发展。