Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
安全控制器PHP(MVC)_Php_Security - Fatal编程技术网

安全控制器PHP(MVC)

安全控制器PHP(MVC),php,security,Php,Security,我知道动态加载请求的类是非常不安全的,但它确实在我的代码中节省了很多复杂性 这是安全的吗?还是有办法让用户利用这个? 这是我的代码: $currentPage = Classes\stdlib::GetVariable("view"); //Gets a variable from $_GET and escapes it... $isAdmin = isset($_GET["admin"]); $view = ""; $content = null; $allowedViews = array

我知道动态加载请求的类是非常不安全的,但它确实在我的代码中节省了很多复杂性

这是安全的吗?还是有办法让用户利用这个? 这是我的代码:

$currentPage = Classes\stdlib::GetVariable("view"); //Gets a variable from $_GET and escapes it...
$isAdmin = isset($_GET["admin"]);
$view = "";
$content = null;
$allowedViews = array("Admin","Brukere","Fag","Fravær","Kontakt","Login","Profil","Registrer");
if (in_array($currentPage,$allowedViews,true)) {
    $view = "Views\\$currentPage";
    $content = new $view(); // <--- This is usualy unsecure since its derived from user request
}

//Using $content later in the code....
如果类在数组中被允许,这基本上只是加载类


你们觉得怎么样?主要安全漏洞还是正常?

正如Marc B所说,包含代码为include$\u GET['foo']的文件是不安全的,因为它是一个文件包含漏洞。例如,攻击者可以上载一个包含PHP代码的完全有效的图像文件,并通过更改$\u GET['foo']的值将其包含在此代码中。因此,只有在验证输入后才能使用include。例如,有几种方法可以做到这一点

$map = array('bar' => 'bar.php');
if (!isset($map[$_GET['foo']]))
    throw new \Exception();
include($map[$_GET['foo']]);
或者干脆用if-else

if ($_GET['foo'] == 'bar')
    include('bar.php');
else
    throw new \Exception();
使用自动加载解决了同样的问题。它定义了一个如何构建类文件映射的规则,因此具有较低的风险。例如,此易受攻击的代码:

他只能检查您的系统中有哪些可用的类,并且可能使用doSomething方法对您使用可用的类。这仍然是C的一个安全风险,但不像文件包含那个么大

因此,通过使用类,您应该执行与我在开头所写的相同的映射:

if ($_GET['foo'] == 'bar' && $_SESSION['isAdmin'])
    $view = new Views\AdminView();
else
    $view = new Views\RegularView();
$view ->doSomething();
我不认为拥有一个允许的视图类列表是一个最佳实践。我认为您应该在查询数据之前进行授权。通过呈现视图,您通常已经从数据库或文件中获取了一些数据,但我们不希望未经授权的用户发送该查询,因为它完全是多余的,只会占用服务器上的资源


在您的代码中$isAdmin=isset$\u GET[admin];这很奇怪。每个人都可以设置该参数,因此使用它来确定某人是否是管理员将是一个巨大的设计缺陷。除了OAuth请求签名和CSRF令牌之外,来自$\u GET或$\u POST的每个变量都可能被伪造:D.尝试了解更多关于会话、身份验证和授权的信息,如果您对安全性有进一步的疑问,您应该在这里问它:

自动加载类不是不安全的,只要您不让用户直接指定它们。e、 g.include$\u GET['foo']您的代码看起来不错:您有一个有效视图数组要使用,并对照它进行检查。我猜稍后您会处理请求的视图不在数组中的情况,并让脚本退出。Thnks,太快了!是的,如果没有选择任何有效的视图,它将进入默认视图,但如果有人尝试一些有趣的buisniss:PYou需要查看自动加载器,我将包括一个日志功能todetect。正如其他人所提到的,自动加载很好,只要您不直接基于用户输入,即新供应商/软件包/{$\u GET[key]}Controller.Hi inf3rno,谢谢您的回答!issetadmin只是为了简化我菜单的呈现,所以如果在请求中设置了,则admin下拉列表将设置为active:P可能会更改此设置,以便视图本身决定它是否为admin视图。。。我很难找到设计所有视图的最佳方法,而且经常会退回到让index.php处理所有工作。我需要进一步调查。。。不管怎样,谢谢你提供了一个信息丰富的答案!:
if ($_GET['foo'] == 'bar' && $_SESSION['isAdmin'])
    $view = new Views\AdminView();
else
    $view = new Views\RegularView();
$view ->doSomething();