【问题标题】:Encrypting and doing a check on session variable before MySQL query在 MySQL 查询之前加密并检查会话变量
【发布时间】:2023-03-03 19:13:01
【问题描述】:

我有一个这样的网址(您需要登录才能看到): https://www.example.com/form.php?id=268

form.php 供用户更新特定数据库条目的详细信息(在本例中为 id 268)

应用程序基本上获取 id 号,对其进行验证和清理,运行 mysql 查询,然后用查询结果填写表单。

在查询中,我使用来自 url 的 id 以及在登录时设置的会话变量 $_SESSION['company_id']。这意味着如果用户手动将 url 更改为(例如)?id=269,他/她将只能在 company_id 与 session 变量中设置的 company_id 匹配的情况下看到 id 269 的详细信息。

我相信 url id 会正常/安全,但 session 变量让我担心。在运行 mysql 查询之前,我没有对会话变量执行任何 IP 或用户代理检查,这让我感觉有点暴露。所以...

  1. 您认为我应该加密 $_SESSION['company_id'] 以提高安全性吗?
  2. 您认为是否值得在运行前运行用户代理检查 查询?这会增加任何安全价值吗?

--

更新

已重写问题和标题以尝试更具体

【问题讨论】:

  • 您的第一个大禁忌是生成这样的 SQL 查询;你向injection attacks敞开心扉。使用prepared statements。
  • 您还需要清理和验证输入。在这种情况下,应该很容易确保 ID 是有效的 int。
  • 我转义了 get $id = mysqli_real_escape_string($link, $_GET['id']) 这有帮助
  • 这不是一个真正适合 SO 的问题;你基本上是在问“向我建议一些安全技术”......
  • 干杯奥利 - 可以明白你的意思。会考虑改写。

标签: php database security session web-applications


【解决方案1】:

如果没有 PHP 为您做这件事,就无法读取或修改 $_SESSION 变量,所以我认为您没有理由对它们进行加密。由于这个问题似乎主要是关于个人意见或安全技术,这就是我要做的:

  1. 我不知道为什么,但每当我在 URL 中看到 GET 变量时,我总是开始在脑海中尖叫不安全。这对我来说似乎很冒险。我认为这样的 URL 只会让更多人想要尝试一些东西。它还会影响 SEO 排名。我会做一些 mod_rewriting 以便http://www.example.com/form/123/ 自动加载http://www.example.com/form.php?id=123。如果不出意外,至少 URL 看起来不错。

  2. 不要假设 ID 总是包含数字。为什么不自己验证 ID 并确保它只包含数字?

  3. 我不知道 PHP 中准备好的语句的确切实现,所以我不会费心给你举个例子,但我建议使用它们。它们大大降低了 SQL 注入的风险。

这是一个 .htaccess 文件来演示 URL 重写:

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^form/([0-9]+)/?$ form.php?id=$1 [L,QSA]
</IfModule>

验证:

<?php
if(preg_match("/^[0-9]+$/", $_GET['id']))
{
    // show record
}
?>

【讨论】:

    【解决方案2】:

    我将尝试解决您已经很糟糕的编程习惯,
    .1 从不向用户发送原始 ID
    .2 始终在查询之前对数据进行清理,否则您会在电话上找到您自己,而您的托管公司整天都在重置您的服务器....
    .3 您可以将任何内容传递给您的服务器并操作数据。

    这是一种防止用户更改它的方法 html标记:

    //在登录页面设置一个隐藏的id字段像这样

    <? 
    $array = array('1,2,3,4,5,6,7,8,9,10');
    shuffle($array);
    $val = pop($array);
    $val =  md5($val) 
    ?>
    
    <form action="page.php?$val">
    <input name="whatever" value "<? echo $val ?>"
    ..... rest of your form
    </form>
    

    那么你想用下面的代码制作page.php

    <?
    switch($_POST['whatever']){
       case md5(1):
    ... run your login code
       break;
       case md5(2):
    ... run your login code
    break;
       case md5(3):
    ... run your login code
    break;
       case md5(4):
    ... run your login code
    break;
       case md5(5):
    ... run your login code
    break;
       case md5(6):
    ... run your login code
    break;
       case md5(7):
    ... run your login code
    break;
       case md5(8):
    ... run your login code
    break;
       case md5(9):
    ... run your login code
    break;
       case md5(10):
    ... run your login code 
    break;
    }
    ?>
    

    现在这个数字是什么并不重要,因为它是随机的......但是如果他们改变了 URL 中的一个字符,它将与服务器定义的md5 字符串不匹配,witch 将不会被抓住switch statement..... 现在需要一些额外的错误报告,但那是你的工作孩子! 希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-05-23
      • 2015-10-01
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 2020-02-17
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      相关资源
      最近更新 更多