【问题标题】:Using variables to check if certain things are allowed使用变量检查是否允许某些事情
【发布时间】:2012-04-03 22:45:01
【问题描述】:

我正在考虑在我的网站上实现打开和关闭某些功能的功能,例如注册和登录。 我可以包含一个像这样的变量的文件

<?php
$upload = 1;
$register = 1;
?>

然后假设我的 register.php 文件我可以像这样进行检查

if($register == 1){
//Show form
} else { echo "Registration is disabled" }

我想知道这是否会是一个安全问题,因为我在某处读到的东西可以在 url 后缀以带来相同的效果 像这样

register.php?register=1

但是如果寄存器全局被关闭,这将不起作用,这是一个安全问题吗?

【问题讨论】:

  • 不,你没看错;仅当您使用寄存器全局变量(5.4 中已弃用并删除的功能)时,这才是一个问题

标签: php security variables upload globals


【解决方案1】:

如果您从包含的文件中获取这些常量,那么使用常量而不是变量会更好一些。在任何情况下都不能在运行时修改常量:

define('UPLOAD', 1);
define('REGISTER', 1);

if (defined('REGISTER') && REGISTER === 1) {
  // Registration disabled
} 

只要register_globals 被关闭(它应该是!!!!),全局变量就不能通过$_GET,$_POST,$_REQUEST 中的HTTP 请求修改,除非您通过访问这些超全局变量在代码中明确这样做。

【讨论】:

    【解决方案2】:

    没有

    register.php?register=1 只能从$_GET['register'] 访问 除非您使用的是打开了 register_globals 的旧版本 PHP 谢谢 Lex

    如果你在服务器上配置一些功能,我建议你改用会话。

    $_SESSION['upload'] = 1;
    $_SESSION['register'] = 1;
    

    与常量不同,如果满足某些条件,它们可以更改。

    并且register_globals() 已从最新的 PHP 5.4.0 中删除,所以,不要使用它。

    【讨论】:

    • 除非你使用的是旧版本的 PHP 并打开了 register_globals,你当然不应该这样做。
    • 我使用默认关闭 register_globals 的 php 5.3,感谢@Starx 的回答
    • 在调用 session_destroy() 时这些不是设置为 null 或其他什么吗?
    • @MarshallMathews,当 session_destroy() 被调用时,会话被完全擦除。每个变量都完全未设置。
    【解决方案3】:

    只要你关闭了 register_globals,你就不用担心它。

    【讨论】:

      【解决方案4】:

      关闭全局寄存器,这根本不是问题。如果您收到这样的输入,就会出现问题:

      $register = $_GET['register'];

      并且不要检查你是否真的得到了一个数字而不是一些恶意代码。

      【讨论】:

        猜你喜欢
        • 2017-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-17
        • 2020-08-23
        • 1970-01-01
        • 2018-05-31
        相关资源
        最近更新 更多