Переопределения IIS7 customErrors, когда установка Response. StatusCode?

Каждый ответ здесь охватывает только часть проблемы. На самом деле существует четыре разных части запроса, которые мы можем добавить к ней динамически:

  • строка
  • номер
  • идентификатор
  • ключевое слово синтаксиса.

и подготовленные операторы охватывают только 2 из них

. Но иногда нам приходится делать наш запрос еще более динамичным, добавляя операторы или идентификаторы также. Таким образом, нам понадобятся разные методы защиты.

В целом такой подход защиты основан на whitelisting . В этом случае каждый динамический параметр должен быть жестко закодирован в вашем скрипте и выбран из этого набора. Например, для динамического упорядочения:

$orders  = array("name","price","qty"); //field names
$key     = array_search($_GET['sort'],$orders)); // see if we have such a name
$orderby = $orders[$key]; //if not, first one will be set automatically. smart enuf :)
$query   = "SELECT * FROM `table` ORDER BY $orderby"; //value is safe

Однако есть еще один способ защитить идентификаторы - экранирование. Пока вы указываете идентификатор, вы можете избежать обратных звонков внутри, удвоив их.

В качестве еще одного шага мы можем заимствовать поистине блестящую идею использования некоторого заполнителя (прокси для представления фактического значения в запросе) из подготовленных операторов и изобретать местозаполнитель другого типа - заполнителя идентификатора .

Итак, чтобы сделать длинный рассказ коротким: это заполнитель, не подготовленное заявление можно рассматривать как серебряную пулю.

Итак, общая рекомендация может быть сформулирована так: Пока вы добавляете динамические части запроса с использованием заполнителей (и эти заполнители правильно обрабатываются, конечно), вы можете быть уверены, что ваш запрос безопасен.

Тем не менее, есть проблема с ключевыми словами синтаксиса SQL (например, AND, DESC и т. д.), но белый список - единственный подход в этом случае.

Обновить

Несмотря на то, что существует общее согласие в отношении наилучшей практики защиты SQL-инъекций, все еще существует множество плохих методов. И некоторые из них слишком глубоко укоренены в умах пользователей PHP. Например, на этой самой странице есть (хотя и невидимые для большинства посетителей) более 80 удаленных ответов - все они удалены сообществом из-за плохого качества или продвижения плохих и устаревших практик. Хуже того, некоторые из плохих ответов не удаляются, а скорее процветают.

Например, там (1) являются (2) еще (3) many (4) отвечает (5) , в том числе второй наиболее ответный ответ , предлагающий вам ручное стирание строки - устаревший подход, который оказался небезопасным.

Или есть несколько лучший ответ, который предлагает только другой метод форматирования строк и даже может похвастаться им как окончательной панацеей. Хотя, конечно, это не так. Этот метод не лучше обычного форматирования строки, но он сохраняет все свои недостатки: он применим только к строкам и, как и любое другое ручное форматирование, по существу является необязательной, необязательной мерой, склонной к человеческой ошибке любого рода.

Я думаю, что все это из-за одного очень старого суеверия, поддержанного такими авторитетами, как OWASP или PHP manual , который провозглашает равенство между тем, что «ускользает» "и защита от SQL-инъекций.

Независимо от того, что написано в руководстве по PHP, *_escape_string ни в коем случае не делает данные безопасными и никогда не предназначались. Помимо бесполезности для любой части SQL, отличной от строки, ручное экранирование неверно, поскольку оно является ручным, как автоматическое.

И OWASP делает это еще хуже, подчеркивая, что пользовательский вход пользователя является совершенно бессмысленным: таких слов в контексте защиты от инъекций не должно быть. Каждая переменная потенциально опасна - независимо от источника! Или, другими словами, каждая переменная должна быть должным образом отформатирована, чтобы быть помещенной в запрос - независимо от источника. Это вопрос назначения. В тот момент, когда разработчик начинает отделять овец от коз (думая, является ли какая-то конкретная переменная «безопасной» или нет), он делает свой первый шаг к катастрофе. Не говоря уже о том, что даже формулировка предполагает, что в точке входа происходит массовое ускорение, напоминающее очень волшебную функцию кавычек - уже презренный, устаревший и удаленный.

Итак, в отличие от любого «экранирования» подготовленные операторы мера, которая действительно защищает от SQL-инъекции (если применимо).

Если вы все еще не уверены, вот пошаговое объяснение, которое я написал, The Hitchhiker's Guide на SQL Injection Prevention , где я подробно объяснил все эти вопросы и даже составил раздел, полностью посвященный плохим практикам и их раскрытию.

98
задан Community 23 May 2017 в 12:18
поделиться

4 ответа

Набор existingResponse к PassThrough в разделе system.webServer/httpErrors:

  <system.webServer>
    <httpErrors existingResponse="PassThrough" />
  </system.webServer>

Значение по умолчанию existingResponse свойства является Автоматическим:

Автоматический говорит пользовательскому ошибочному модулю делать правильную вещь. Фактический текст ошибки, замеченный клиентами, будет затронут в зависимости от значения fTrySkipCustomErrors, возвращенного в IHttpResponse::GetStatus звонить. Когда fTrySkipCustomErrors будет иметь значение true, пользовательский ошибочный модуль позволит ответу пройти, но если он имеет значение false, пользовательский ошибочный модуль заменяет текст своим собственным текстом.

Больше информации: Что ожидать от пользовательского ошибочного модуля IIS7

116
ответ дан Pavel Chuchuva 24 November 2019 в 05:13
поделиться

IIS 7 по умолчанию использование подробно изложило пользовательские сообщения об ошибках, таким образом, я приму тот Ответ. StatusCode будет равняться 404. XX, а не всего 404.

можно настроить IIS7 для использования, чем более простые коды сообщения об ошибке или изменяют обработку кода, тем более подробные сообщения об ошибках это IIS7 предлагает.

[еще 113] информация, доступная здесь: http://blogs.iis.net/rakkimk/archive/2008/10/03/iis7-enabling-custom-error-pages.aspx

, Дальнейшее расследование показало, что у меня было оно неправильный путь вокруг - подробные сообщения не по умолчанию, но возможно они были включены на Вашем поле, если Вы видите различные сообщения об ошибках, что Вы упомянули.

0
ответ дан nullnvoid 24 November 2019 в 05:13
поделиться

Решенный: оказывается, что "Подробные Ошибки" должен идти для IIS7 к "передаче" любая ошибочная страница, которую Вы могли бы иметь. См. http://forums.iis.net/t/1146653.aspx

11
ответ дан Nicholas H 24 November 2019 в 05:13
поделиться

The easiest way to make the behavior consistent is to clear the error and use Response.TrySkipIisCustomErrors and set it to true. This will override the IIS global error page handling from within your page or the global error handler in Application_Error.

Server.ClearError();
Response.TrySkipIisCustomErrors = true;

Typically you should do this in your Application_Error handler that handles all errors that your application error handlers are not catching.

More detailed info can be found in this blog post: http://www.west-wind.com/weblog/posts/745738.aspx

80
ответ дан 24 November 2019 в 05:13
поделиться
Другие вопросы по тегам:

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