Можно ли использовать $ SERVER ['PHP_AUTH_USER'] для управления правами? [Дубликат]

TL; DR: Попробуйте использовать Html.Partial вместо Renderpage


Я получал Object reference not set to an instance of an object, когда пытался сделать вид в представлении, отправив ему модель, например это:

@{
    MyEntity M = new MyEntity();
}
@RenderPage("_MyOtherView.cshtml", M); // error in _MyOtherView, the Model was Null

Отладка показала, что модель была Null внутри MyOtherView. Пока я не сменил его на:

@{
    MyEntity M = new MyEntity();
}
@Html.Partial("_MyOtherView.cshtml", M);

И это сработало.

Кроме того, причина, по которой я не имел Html.Partial для начала, заключалась в том, что Visual Studio иногда выдает ошибки, (f9), если он находится внутри другого построенного цикла foreach, хотя это не ошибка:

@inherits System.Web.Mvc.WebViewPage
@{
    ViewBag.Title = "Entity Index";
    List<MyEntity> MyEntities = new List<MyEntity>();
    MyEntities.Add(new MyEntity());
    MyEntities.Add(new MyEntity());
    MyEntities.Add(new MyEntity());
}
<div>
    @{
        foreach(var M in MyEntities)
        {
            // Squiggly lines below. Hovering says: cannot convert method group 'partial' to non-delegate type Object, did you intend to envoke the Method?
            @Html.Partial("MyOtherView.cshtml");
        }
    }
</div>

Но я смог запустить приложение без проблем с этим " ошибка". Я смог избавиться от ошибки, изменив структуру цикла foreach, чтобы выглядеть так:

@foreach(var M in MyEntities){
    ...
}

Хотя я чувствую, что это потому, что Visual Studio неправильно интерпретировала амперсанды и скобки .

88
задан Benjol 27 July 2011 в 13:32
поделиться

2 ответа

Нет таких вещей, как «безопасные» или «небезопасные» значения как таковые. Существуют только значения, которые сервер контролирует и значения, которые пользователь контролирует, и вам нужно знать, откуда приходит значение, и, следовательно, можно ли им доверять в определенной цели. $_SERVER['HTTP_FOOBAR'], например, полностью безопасно хранить в базе данных, но я, конечно, не хотел бы eval.

. Итак, разделим эти значения на три категории:

Сервер управляется

Эти переменные устанавливаются средой сервера и полностью зависят от конфигурации сервера.

  • 'GATEWAY_INTERFACE'
  • 'SERVER_ADDR'
  • 'SERVER_SOFTWARE'
  • 'DOCUMENT_ROOT'
  • 'SERVER_ADMIN'
  • 'SERVER_SIGNATURE'

Частично управляемый сервером

Эти переменные зависят от конкретного запроса, отправленного клиентом, но могут принимать только ограниченное количество допустимых значений, поскольку все недопустимые значения должны быть отклонены веб-сервером и не вызвать вызов сценарий для начала. Следовательно, их можно считать надежными .

  • 'HTTPS'
  • 'REQUEST_TIME'
  • 'REMOTE_ADDR' *
  • 'REMOTE_HOST' *
  • 'REMOTE_PORT' *
  • 'SERVER_PROTOCOL'
  • 'HTTP_HOST'
  • 'SERVER_NAME'
  • 'SCRIPT_FILENAME'
  • 'SERVER_PORT'
  • 'SCRIPT_NAME'

* Значения REMOTE_ гарантированно будет действительным адресом клиента, подтвержденным рукопожатием TCP / IP. Это адрес, на который будет отправлен любой ответ. REMOTE_HOST полагается на обратные запросы DNS, хотя и может быть подделано атаками DNS на ваш сервер (в этом случае у вас есть большие проблемы в любом случае). Это значение может быть прокси-сервером, который является простой реализацией протокола TCP / IP и ничего не может сделать.

† Если ваш веб-сервер отвечает на любой запрос независимо от того, заголовка HOST, это также должно считаться небезопасным. См. Насколько безопасно $ _SERVER ["HTTP_HOST"]? . Также см. http://shiflett.org/blog/2006/mar/server-name-versus-http-host .

‡ См. https: // bugs .php.net / bug.php? id = 64457 , http://httpd.apache.org/docs/current/mod/core.html#usecanonicalphysicalport , http : //httpd.apache.org/docs/2.4/mod/core.html#comment_999

Полностью произвольные контролируемые пользователем значения

Эти значения не проверяются вообще и не зависят от какой-либо конфигурации сервера, они являются полностью произвольной информацией, отправленной клиентом.

  • 'argv', 'argc' (применимо только к вызову CLI, обычно не относится к веб-серверам )
  • 'REQUEST_METHOD' §
  • 'QUERY_STRING'
  • 'HTTP_ACCEPT'
  • 'HTTP_ACCEPT_CHARSET'
  • 'HTTP_ACCEPT_ENCODING'
  • 'HTTP_ACCEPT_LANGUAGE'
  • 'HTTP_CONNECTION'
  • 'HTTP_REFERER'
  • 'HTTP_USER_AGENT'
  • 'AUTH_TYPE'
  • 'PHP_AUTH_DIGEST'
  • 'PHP_AUTH_USER'
  • 'PHP_AUTH_PW'
  • 'PATH_INFO'
  • 'ORIG_PATH_INFO'
  • 'REQUEST_URI' (может содержать испорченные данные)
  • 'PHP_SELF' (может содержать испорченные данные)
  • 'PATH_TRANSLATED'
  • любое другое значение 'HTTP_'

§ Может считаться надежным , если веб-сервер допускает только определенные методы запроса.

‖ Может считаться надежным , если аутентификация полностью обрабатывается веб-сервером.

Суперглобал $_SERVER также включает в себя несколько переменных среды. Являются ли они «безопасными» или не зависят от того, как (и где) они определены. Они могут варьироваться от полностью контролируемого сервера до полностью управляемого пользователем.

134
ответ дан Community 23 August 2018 в 21:43
поделиться

В PHP на каждую переменную $_SERVER, начиная с HTTP_, может влиять пользователь. Например, переменная $_SERVER['HTTP_REINERS'] может быть испорчена установкой HTTP-заголовка REINERS произвольным значением в HTTP-запросе.

10
ответ дан Spudley 23 August 2018 в 21:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: