PHP 隐藏 id 不显示在 href url 中


PHP Hide id from being shown in a href url

我有两个MySQL表。第一个是用户的凭据,即用户名、密码business_id(系统生成(。第二个具有多个实体的用户配置文件,例如公司名称,位置,profile_id和业务ID(系统生成 - business_id相同的数字(。

用户可以编辑其业务详细信息的详细信息,即第二个表中的详细信息。商家 ID 将显示为"abcdef",配置文件 ID 将显示为1234567,如果他们有第二个业务配置文件,则会显示1235879。

为了编辑每个配置文件,我必须具有以下URL

<a href="edit_profile.php?id=1234567">Edit Business Profile</a>

对于第二个,它将是

<a href="edit_profile.php?id=1235879">Edit Business Profile</a>

反过来,当单击href时,浏览器中的URL将被edit_profile.php?id=1234567,第二个将edit_profile.php?id=1235879

是否有可能不是在URL中edit_profile.php?id=1234567edit_profile.php?id=1235879,我会edit_profile.php?id=1234567,第二个是edit_profile.php

我不希望用户看到id,即只有edit_profile.php

理想情况下,我想使用 PHP 解决方案,请。

是的,这是可能的,但不完全是你想做什么


解决方案#1

诱导

首先,它应该仅适用于当前登录并尝试查看其个人资料的用户。最终结果是,如果 ID 等于当前登录用户的 ID,则不会在 URL 中显示 ID。它比解决方案#2更常见,但如果要隐藏所有ID,请跳过此解决方案。

优点

  • 没有太多要更改的,只需多添加几行用于检查当前用户 ID
  • 您仍然可以对Edit Business Profile链接使用 <a></a> 标记。

缺点

  • 只有当前登录用户的 ID 才会隐藏在 URL 中

那怎么办...

您可能会使用会话让用户保持登录状态,即使他们刷新了页面也是如此。您走在正确的道路上,但您应该至少再添加一个元素$_SESSION(配置文件标识,因此我们可以将其称为profile_id例如(。

假设您正在使用以下登录公式:

function check_login($username, $password)
{
    // query to find user with these inputs (encrypted password, prepared statements, etc)
    if($query->num_rows > 0) // user exists
    {
        // fetch your query
        // ...
        session_start();
        // set the session probably user is logged
        // some return on success (probably redirect)
    }
    else
    {
        // some return on false
    }
}

现在,您应该再添加一个$_SESSION元素来保存当前的profile_id值:

session_start();
// ...
$_SESSION['profile_id'] = $result->profile_id; // <--- THIS IMPLEMENT
// some return on success (probably redirect)

1/2 完成!

问题的一半已经完成,现在您需要做的就是将$_GET输入与$_SESSION进行比较。

同样,假设您的edit_profile.php文件如下所示:

if(isset($_GET['id']) && !empty(trim($_GET['id'])))
{
    $profile_id = intval($_GET['id']);
    // ...
}
else
{
    // probably an error profile id is not defined
}
// rest of the code ...

所以现在没有定义错误配置文件 id,我们可以分配给超全局$_SESSION的变量索引profile_id $profile_id

else
{
    $profile_id = intval($_SESSION['profile_id']);
}

请注意,我假设您有条件拒绝访问此脚本,如果用户未记录(开始时的某些条件(。

现在您的代码应该可以工作了,但也许您正在问一个问题,如果用户知道他的 ID 并将其输入 URL 怎么办?

所以你有两个选择:

  • 顺其自然
  • 添加条件以检查$_GET['id']是否等于$_SESSION['profile_id']然后重定向到edit_profile.php

最后的想法...

也许如果您正在生成用户列表,用户可以在其中编辑其他人的用户配置文件,包括他自己的配置文件,如果您希望删除edit_profile.php URL 的参数id如果用户的 ID 等于获取循环中的当前 ID。您可以通过这个简单的功能来激发灵感:

function generate_profile_edit_url($id)
{
    session_start(); // for the case, you don't have started session yet
    return '<a href="edit_profile.php' . ($_SESSION['profile_id'] == $id ? '' : '?id=' . $id) . '">Edit Business Profile</a>';
}

仅在每次获取迭代中,您将使用此函数,如下例所示:

// ...
echo generate_profile_edit_url($result->profile_id);
// ...

解决方案#2

介绍

此解决方案将访问编辑用户的配置文件,而 URL 中没有任何 ID 参数。它适用于以下情况:用户有权编辑其他人(例如,版主或管理员(的个人资料,而您仍然不希望在 URL 中包含用户的 ID。

优点

  • 所有用户都需要在 URL 中指定 ID 参数

缺点

  • 您必须在没有 JavaScript 知识的情况下使用 POST 操作将每个配置文件链接更改为小形式
  • 不再有用于配置文件编辑的<a></a>链接,同样没有JavaScript知识
  • 如果用户愿意,他们仍然可以获取他们的 ID

那怎么办...

首先,我们需要更改edit_profile.php文件。我们必须接收包含目标profile_id$_POST数据。

与解决方案 #1 中一样,假设您的edit_profile.php如下所示:

if(isSet($_GET['id']) && !empty(trim($_GET['id'])))
{
    $profile_id = intval($_GET['id']);
    // ...
}
else
{
    // probably an error profile id is not defined
}
// rest of the code ...

大多数更改只是将$_GET替换为$_POST

if(isSet($_POST['profile_id']) && !empty(trim($_POST['profile_id'])))
{
    $profile_id = intval($_POST['profile_id']);
    // ...
}
else
{
    // probably an error profile id is not defined
}
// rest of the code ...

对于这个文件,这就足够了。

现在,如果您在不同的文件中放置了配置文件链接,则还有更多工作要做。但是我们可以使用像这样的简单函数来简化它:

function get_profile_edit_button($profile_id)
{
    $html = '<form action="edit_profile" method="POST">';
    $html .= '<input type="hidden" name="profile_id" value="' . intval($profile_id) . '">';
    $html .= '<input type="submit" value="Edit Business profile">';
    $html .= '</form>';
    return $html;
}

最后一件事是用此功能替换当前的编辑配置文件链接。例如,你有用户的获取循环:

// ...
echo '<a href="edit_profile.php?id='" . $result->profile_id . '">Edit Business Profile</a>';
// ...

因此,您将用函数get_profile_edit_button()替换此字符串:

// ...
echo get_profile_edit_button($result->profile_id);
// ...

最后的想法...

正如我在缺点中提到的,个人资料的 ID 不能完全隐藏。如果有人打开了您网页的源代码,他可以看到隐藏表单类型中的profile_id

<input type="hidden" name="profile_id" value="1234567">

只有您喜欢哪种解决方案,但我可以向您推荐解决方案#1。在 URL 中包含 ID 并没有什么不好。堆栈溢出也有它,因为您可以在问题,答案,评论和用户中看到它。


有用的资源:

  • PHP 会话安全性
  • PHP 表单令牌的使用和处理

登录时,尝试在会话中保存用户 ID 和业务 ID。

例如..

$logged_in = some_logic_stuffs();
if($logged_in){
  session_start();
  $_SESSION['user_id'] = SOME_ID_FETCHED_FROM_LOGIN_LOGIC;
   $_SESSION['business_id'] = SOME_ID_FETCHED_FROM_LOGIN_LOGIC;
}

现在,当用户转到edit_profile.php时,执行

session_start();
$business_id =  $_SESSION['business_id'];
$user_id =  $_SESSION['business_id'];

有关登录逻辑,请尝试阅读本教程:

http://www.formget.com/login-form-in-php/

如果用户可以编辑多个商家资料,则 $_SESSION 解决方案将不起作用。 您需要伪装发送到地址栏的内容:

您需要更改代码以 POST 数据,而不是将其作为 GET 请求发送。

为此,您可以使用JavaScript在链接点击时伪造表单帖子,或者将您的链接包装在表单标签中并设置method="POST"。

POST 在"幕后"发送数据,而不是在浏览器中公开数据。 我应该补充一点,任何想要发现您的ID的人仍然可以看到这一点,但它至少会对临时用户隐藏它。

如果你真的想要安全,@BobBrown的建议标记化将是一个很好的前进方向。 但是,您可能会发现,只需隐藏屏幕上显示的ID就足够了。 只需确保您的用户管理系统将限制谁可以编辑特定业务即可。

试试这个

<?php
    session_start();
    include('dbconnect.php');
    if(isset($_SESSION['username']))
    {
        $username = $_SESSION['username'];
        $userid = $_SESSION['id'];
    }
    else
    {
        $_SESSION['id'] = "";
        $_SESSION['username'] = "";
    }
    if($username <> "")
    {
        $username = 'username';
        $userid = 'id';
    }
    if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 900))
    {
        // last request was more than 30 minutes ago
        session_unset();    // unset $_SESSION variable for the run-time 
        session_destroy(); // destroy session data in storage
    }
    $_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp
?>

然后

<?php
#if the form is set (meaning that the information was submitted then define what the parameters are for each
if(isset($_REQUEST['username']) == TRUE)
{   
        $username = $_REQUEST['username'];
        $password = $_REQUEST['password'];  
        #make sure there are no blank fields
        if($username == "" OR $password == "")
        {
                echo '<p class="text-danger">Please enter a Username and Password</p>';
        }
        else
        {
            $userid = finduser($username, $password);
            if($userid > 0)
            {
                loginuser($userid);
            }
            else
            {
                echo '<p class="lead text-danger">The Username and/or Password enter is incorrect</p><br />';
            }
        }
    }
?>

在那之后,这个

<?php
    if(isset($_SESSION['username']))
    {
        if($_SESSION['username'] <> "")
        {
            //do something
        }
        else{
                //form or something else
?>
<form>form goes here</form>
<p> or something else you want</p>
<?php
    }
}
?>

使用 session_start(( 启动 PHP;然后在用户登录时为 ID 创建一个会话值:

$_SESSION['profile-id'] = 1235879; //Select it from database

在您的edit_profile.php之后,请执行以下操作:

if (!isset($id)) { 
    $id = $_SESSION['profile-id'];
}

然后编辑$id。

将 id 存储在第一页上的会话中:

$_SESSION['id'] = 12345;

edit_profile.php上,您可以通过以下方式获取值:

$id = $_SESSION['id'];

并通过session_start();在每个页面上启动会话

如果您想在URL中使用ID或任何信息并通过URL传递,这是处理您的情况的最简单和最简单的方法然后,您可以像下面这样将scret与您的值进行组合首先,您必须使用秘密内容对值进行编码,例如

$sshhh="ITSMY_SECRET_VALUECODE";
$encrypted_id = base64_encode($your_value . $sshhh);

然后在 URL 中传递它 (encrpyted_id(例如href="all-jvouchers.php?id=<?= $encrypted_id; ?>

在获取价值的同时,使用以下代码来取回您的价值

$sshhh="ITSMY_SECRET_VALUECODE";    
$decrypted_id_raw = base64_decode($_GET['id']);
$decrypted_id = preg_replace(sprintf('/%s/', $sshhh), '', $decrypted_id_raw);
随时随地

以您想要的方式安全地使用$decrypted_id