Когда вы доверяете данным / переменным - PullRequest
4 голосов
/ 22 мая 2010

Мы все знаем, что все данные пользователя, GET / POST / Cookie и т. Д. Должны проверяться для обеспечения безопасности.

Но когда вы останавливаетесь, когда он преобразуется в локальную переменную?

например

if (isValidxxx($_GET['foo']) == false) {
  throw InvalidArgumentException('Please enter a valid foo!');
}

$foo = $_GET['foo'];
fooProcessor($foo);

function fooProcessor($foo) {
  if (isValidxxx($foo) == false) {
    throw Invalid......
  }
//other stuff
}

Для меня это слишком. Но что, если вы загрузите значение из базы данных ...

Надеюсь, в этом есть смысл:)

Ответы [ 4 ]

2 голосов
/ 22 мая 2010

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

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

1 голос
/ 22 мая 2010

Ты слишком много думаешь об этом.

Проверка всего, что необходимо проверить (т. Е. Все вводимые пользователем данные), один раз в пути кода, в достаточно поздней точке, когда пользователь не может изменить его в том же сеансе сервера.

Не имеет значения, когда. Просто будьте последовательны и делайте все, что вам нужно, чтобы ваш код читался и обслуживался.

0 голосов
/ 22 мая 2010

Чтобы ответить на ваш вопрос, $ _GET и $ _POST должны никогда не доверять . Тем не менее, это не уязвимость, пока переменная не используется. Если вы распечатаете его print($_GET[xss]), то у вас есть уязвимость в xss. Если вы вставите эту переменную в базу данных, а затем распечатаете ее (как сообщение на форуме), то у вас будет сохраненная xss , что еще хуже.

Вам нужно лучше понять образ мыслей атакующих. Такие переменные, как $ _GET, являются источниками taint , вызовы функций, такие как print() и mysql_query(), являются раковинами . Хакер ищет стоки, на которые он может повлиять с испорченными переменными. В php есть много раковин, и я рекомендую прочитать эту черную бумагу (или красную бумагу, вне зависимости от ее достоверности, а не белую ...). Обязательно прочитайте раздел «Язык против программиста».

0 голосов
/ 22 мая 2010

Суперглобальные переменные, такие как $ _GET, $ _POST, $ _COOKIE или $ _SERVER НЕ МОГУТ быть изменены пользователем во время сценария.Как только ваш скрипт загрузится, вот и все.Поэтому вам нужно проверять их только один раз, когда они входят. Выполнение этого более одного раза не имеет никакого смысла и тратит впустую процессорное время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...