【问题标题】:How to add security while using GET and POST method?如何在使用 GET 和 POST 方法时增加安全性?
【发布时间】:2013-09-12 13:00:57
【问题描述】:

我开发了一个小型应用程序联系人管理器,并在更新联系人时,使用 GET 方法发送联系人 ID。但是用户可以更改 ID 并编辑任何联系人,我该如何为其添加安全性?

<td>
    <a href="home.php?action=update&amp;contactid=<?php echo $contact->contact_id; ?>">Update</a>
</td>

http://localhost/contmanager/home.php?action=update&contactid=1

如果我将 id 更改为其他号码,则会出现另一个联系人。

【问题讨论】:

  • 使用联系人 ID 存储权限/所有者?
  • 我正在使用 contact_by 字段,它是一个外键,引用用户表中的 user_id。

标签: php security post get


【解决方案1】:

您无法控制客户端要求服务器执行的操作。

如果您想对谁可以修改特定联系人添加限制,那么您需要验证(用户名 + 密码、客户端 SSL 证书、OpenID 等)用户,然后检查他们是否已授权(这将取决于您的业务逻辑决定)修改相关条目。

【讨论】:

  • 我遵循了“一个人”的解决方案,它第一次运行良好,但是当我尝试更新其他联系人时,它显示相同的联系人。
  • @MohitChawla — 当然可以,该答案旨在仅让人们更改登录用户的详细信息。如果您想编辑登录用户的联系人,那么您必须按照我在此答案中所说的操作。
  • 未设置呢?我使用 unset $_SESSION['contact_id'] 但它仍然使用相同的contact_id,即使当我使用 var_dump 时 $_SESSION['contact_ID'] 返回 null。
  • 未设置呢?首先,您不应该将联系人 ID 存储在会话中。将用户 ID 存储在会话中。从 $_POST 获取上下文 ID。检查用户是否在会话中属于允许编辑 $_POST 中 id 的联系人的用户。
【解决方案2】:

正如 Quentin 指出的,你的逻辑在这里出了问题,像这样的数据应该存储在会话中,不应该使用 $_GET$_POST 传递,除非并且直到需要,如果你仍然需要传递出于某种原因,您可以提前阅读我的答案以获得解决方案。

将用户id存储在会话中,所以当用户更新时,只需比较会话id和$_GET id,如果匹配,则更新条目,否则抛出错误。

当用户登录时

$_SESSION['user_id'] = $db_data['col_name'];

现在,在条目更新之前...

if(!empty($_GET['user_id'])) {
  //First validate, you can check whether the id is only numeric, is valid db entry etc
  $user_id = $_GET['user_id']; //Store the id in a variable
} else {
  //Invalid
}


if($_SESSION['user_id'] == $user_id) { //Compare the ids
  //Process
} else {
  //Not Valid
}

注意:请确保在页面顶部使用session_start(), 在你开始写任何东西之前。

【讨论】:

  • 如果您只接受与会话中相同的用户 ID,那么首先通过 POST/GET 接受用户 ID 是没有意义的。
  • 我在此应用程序上使用注册和登录,因此我可以使用您的方法,但该用户也可以通过更改 ID 从他自己的联系人中更新一些其他联系人。有没有替代技术?
【解决方案3】:

您需要使用session 并将数据存储在其中:

<?php
    session_start();
    $_SESSION['contact_id']=$contact->contact_id; 
    <td><a href=home.php?action=update&amp;">Update</a></td>
?>

像这样使用它:

http://localhost/contmanager/home.php?action=update

当你需要使用contact_id(在GET之后):

session_start();
if(isset($_SESSION['contact_id']) && !empty($_SESSION['contact_id'])){
   $contact_id=$_SESSION['contact_id'];
  
}

PHP 会话变量用于存储有关用户会话的信息或更改用户会话的设置。会话变量保存有关单个用户的信息,并且可用于一个应用程序中的所有页面。

PHP 会话变量

当您使用应用程序时,您打开它,进行一些更改,然后关闭它。这很像一个会话。电脑知道你是谁。它知道您何时启动应用程序以及何时结束。但是在互联网上存在一个问题:Web 服务器不知道你是谁,你做了什么,因为 HTTP 地址不保持状态。

PHP 会话通过允许您将用户信息存储在服务器上供以后使用(即用户名、购物项目等)来解决这个问题。但是,会话信息是临时的,将在用户离开网站后被删除。如果您需要永久存储,您可能希望将数据存储在数据库中。

会话通过为每个访问者创建唯一 ID (UID) 并基于此 UID 存储变量来工作。 UID 要么存储在 cookie 中,要么在 URL 中传播。

【讨论】:

  • 我遵循了您的解决方案,但在尝试更新其他联系人时出现问题。它一直显示相同的联系人。我也使用了 unset 但没有变化,我已经更新了问题中的代码。
  • @Mohit Chawla 您是否尝试设置$_SESSION['contact_id']="" 并检查empty($_SESSION['contact_id']) 是否存在?
猜你喜欢
  • 2010-12-28
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 2015-12-07
  • 2016-07-14
相关资源
最近更新 更多