PHP隐藏ID显示在href url中

时间:2014-09-08 11:25:15

标签: php

我有两个MySQL表。第一个是用户的凭证,即用户名,密码,business_id(系统生成的)。第二个具有多个实体的用户简档,例如业务名称,位置,profile_id和业务ID(系统生成 - 与business_id相同的编号)。

用户可以在第二个表格中编辑其业务详细信息的详细信息,即其详细信息。商家ID可以说是“abcdef'和个人资料ID可以说是1234567,如果他们有第二个商业档案,那就说1235879。

为了编辑每个配置文件,我必须拥有以下网址

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

对于第二个,它将是

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

当点击a href时,浏览器中的网址将为edit_profile.php?id=1234567,而第二个网址则为edit_profile.php?id=1235879

是否有可能在网址中edit_profile.php?id=1234567edit_profile.php?id=1235879而不是edit_profile.php?id=1234567,而第二个则edit_profile.php

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

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

7 个答案:

答案 0 :(得分:4)

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


解决方案#1

Intoduction

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

<强>加号

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

<强>劣势

  • 只有当前记录的用户ID才会隐藏在网址

那该怎么做......

您可能使用sessions让用户保持登录状态,即使他们刷新了页面也是如此。您是在正确的道路上,但是您应该向$_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 ...

现在,我们可以分配给超级全球$profile_id的{​​{1}}变量索引profile_id,而不是错误个人资料ID未定义

$_SESSION

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

现在你的代码应该可以运行但是你可能会问问题如果用户知道他的ID并将其输入到URL中会怎样?

所以你有两个选择:

  • 让它成为
  • 添加条件以检查else { $profile_id = intval($_SESSION['profile_id']); } 是否等于$_GET['id'],然后重定向到edit_profile.php

最后的想法......

也许如果您要生成用户列表,用户可以在其中编辑其他用户&#39;如果用户的ID等于获取循环中的当前ID,则您希望删除$_SESSION['profile_id'] URL的id参数。你可以通过这个简单的功能激发灵感:

edit_profile.php

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

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>';
}

解决方案#2

简介

此解决方案将覆盖编辑用户的个人资料,而网址中没有任何ID参数。它适用于用户有权编辑其他人的个人资料(例如,主持人或管理员)并且您仍然不想让用户访问的情况。网址中的ID。

<强>加号

  • 所有用户都不需要URL中的ID参数

<强>劣势

  • 您必须使用没有JavaScript知识的POST操作将每个配置文件链接更改为小格式
  • 没有更多// ... echo generate_profile_edit_url($result->profile_id); // ... 个人资料编辑链接,再次没有JavaScript知识
  • 如果用户
  • ,他们仍然可以获取他们的ID

那该怎么做......

首先,我们需要更改edit_profile.php文件。我们必须收到包含目标<a></a>的{​​{1}}数据。

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

$_POST

大多数更改只是将profile_id替换为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>';
// ...

最后的想法......

正如我在迷你,简介中提到的那样。 ids不能完全隐藏。如果有人打开了您网页的源代码,他可以在隐藏的表单类型中看到get_profile_edit_button()

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

只有您喜欢的解决方案,但我可以向您推荐解决方案#1 。在URL中使用ID没有什么不好。 Stack Overflow 也有它,因为你可以在问题,答案,评论和用户上看到它。


有用的资源:

答案 1 :(得分:1)

如果用户可以编辑多个业务配置文件,则$ _SESSION解决方案将无效。您需要伪装发送到地址栏的内容:

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

要执行此操作,您可以使用JavaScript伪造链接点击上的表单帖子,或者将链接包装在表单标记中并设置method =“POST”。

POST会在“幕后”发送数据,而不是在浏览器中公开它。我应该补充说,对于想要发现你的ID的人来说,这仍然是可见的,但至少会将它从临时用户隐藏起来。

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

答案 2 :(得分:1)

登录时,请尝试在会话中保存用户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/

答案 3 :(得分:1)

试试这个

<?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
    }
}
?>

答案 4 :(得分:0)

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

$_SESSION['id'] = 12345;

edit_profile.php 上,您可以获得以下值:

$id = $_SESSION['id'];

session_start();

的每个页面上开始会话

答案 5 :(得分:0)

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

$_SESSION['profile-id'] = 1235879; //Select it from database
在你的edit_profile.php之后

执行:

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

然后编辑$ id。

答案 6 :(得分:0)

如果要使用Id或URL中的任何信息并通过URL传递信息,则是处理情况的最简便方法 那么您可以将值与下面的值组合在一起 首先,您必须使用自己的秘密材料对值进行编码

$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