【问题标题】:PHP Send POST data to rewritten URLPHP 发送 POST 数据到重写的 URL
【发布时间】:2017-04-27 03:49:09
【问题描述】:

我正在开发一个位于mysite.com/page的页面

在这个页面,用户可以输入用户名和密码:

<form method="post">
    <div class='form-group'>
        <label for='username'>Username</label>
        <input class='form-control' id='spreadsheet-form-username' name='username' placeholder='Username'>
    </div>
    <div class='form-group'>
        <label for='password'>Password (optional - required to edit)</label>
        <input type='password' class='form-control' name='password' id='spreadsheet-form-password' placeholder='Password'>
    </div>
    <button type='submit' class='btn btn-default'>Submit</button>
</form>

当用户点击提交时,它会发布数据并将 URL 重写为mysite.com/page/exampleUser 或等效的mysite.com/page?username=exampleUser

如果用户只提交一个用户名进行查找,我希望他们只能在mysite.com/page/exampleUser查看数据,如果他们也提交了正确的密码,他们就可以编辑数据。

我可以获得正确的 URL,但我正在努力寻找如何在 mysite.com/page/exampleUser 页面上检查用户名和密码是否都已发送(以及它们的值是什么)。我希望能够判断是否应该允许他们编辑该页面上的数据。

我试过这段代码:

$mode = "view";

if (isset($_POST["password"])) {
    if (hashOfPassword matches password submitted) {
        $mode = "edit";
    }
}
if (isset($_POST["username"])) {
    $username = $_POST["username"];
    header("Location: /spreadsheet/" . $username);
}

但在重写 URL 时,我似乎无法获取 $_POST["password"] 数据。它仅在 URL 被重写之前可用。

我不一定需要能够发送密码,但我希望能够发送一些信息,让我知道该页面是否应该是可查看或可编辑的。我也不能通过 URL 发送它(例如:mysite.com/page/exampleUser/edit),因为我不希望用户能够通过更改 URL 来编辑其他用户的数据。

这是我处理 url 重写的方式:

// Trim leading slashes
$path = ltrim($_SERVER['REQUEST_URI'], '/');

// Split url on slashes
$elements = explode('/', $path);

if ($elements[0] == "page" && sizeof($elements) == 1) {
    // do nothing, there wasn't a username submitted    
} 
else {

    switch(array_shift($elements))
    {
        case 'page':
            echo "username: " . $elements[1];
            echo "password: " /* not sure what to put here*/;
            break;
        default:
            header("/404.php");
            break;
    }   
} 

还有我的.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ 404.php [L]

任何帮助将不胜感激!

【问题讨论】:

  • 您可以启动session,在 URL 重写之前确认密码,并在 URL 重写之后为会话提供某种“授权”。

标签: php .htaccess url post url-rewriting


【解决方案1】:

您可以在会话中存储密码和某种标识符。在下面的示例中,我使用了uniqid() 来生成密钥。您可以放心地将此 ID 放入重定向 URL。

稍后您可以检查 ID,如果匹配,则使用会话中存储的密码。

// Remove if session is already started at this point
session_start();
$mode = "view";

if (isset($_POST["password"])) {
    if (hashOfPassword matches password submitted) {
        $mode = "edit";
    }
}
if (isset($_POST["username"])) {
    $username = $_POST["username"];

    $passwordId = uniqid();
    $_SESSION['spreadsheetPasswordId'] = $passwordId;
    // Password should be hashed before writing it to session.
    $_SESSION['spreadsheetPassword'] = $_POST["password"]; 

    header("Location: /spreadsheet/" . $username . "/" . $passwordId);
}

以后

// Remove if session is already started at this point
session_start();
// Trim leading slashes
$path = ltrim($_SERVER['REQUEST_URI'], '/');

// Split url on slashes
$elements = explode('/', $path);

// we need at least three elements
if ($elements[0] == "page" && sizeof($elements) < 3) {
    // do nothing, there wasn't a username submitted    
} 
else {

    switch(array_shift($elements))
    {
        case 'page':
            echo "username: " . $elements[1];
            echo "password: " . (
                $_SESSION['spreadsheetPasswordId'] == $elements[2] ?
                $_SESSION['spreadsheetPassword'] : 
                'Access key is invalid or has expired.');
            break;
        default:
            header("/404.php");
            break;
    }   
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 2012-09-02
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    相关资源
    最近更新 更多