我有两个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=1234567
和edit_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