我有两个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=1234567
和edit_profile.php?id=1235879
而不是edit_profile.php?id=1234567
,而第二个则edit_profile.php
我不希望用户看到ID,即只有edit_profile.php
理想情况下,我想使用PHP解决方案。
答案 0 :(得分:4)
首先,它应该仅适用于当前登录并尝试查看其个人资料的用户。要达到的最终结果是,如果ID等于当前登录用户的ID,则不在URL中显示ID。它比解决方案#2 更常见,但如果您想隐藏所有ID,请跳过此解决方案。
<强>加号强>:
<a></a>
个Edit Business Profile
链接标记。<强>劣势强>:
您可能使用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)
问题的一半已经完成,现在您需要做的就是将$_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>';
}
此解决方案将覆盖编辑用户的个人资料,而网址中没有任何ID参数。它适用于用户有权编辑其他人的个人资料(例如,主持人或管理员)并且您仍然不想让用户访问的情况。网址中的ID。
<强>加号强>:
<强>劣势强>:
// ...
echo generate_profile_edit_url($result->profile_id);
// ...
个人资料编辑链接,再次没有JavaScript知识首先,我们需要更改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'];
对于登录逻辑,请尝试阅读本教程:
答案 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