Система входа в систему PHP

Единицей является просто МОК "контейнер". Google StructureMap и испытывает его вместо этого. Немного легче к grok, я думаю, когда материал МОК в новинку для Вас.

В основном, если Вы понимаете МОК тогда, Вы понимаете, что то, что Вы делаете, инвертирует управление для того, когда объект создается.

Без МОК:

public class MyClass
{
   IMyService _myService; 

   public MyClass()
   {
      _myService = new SomeConcreteService();    
   }
}

С контейнером МОК:

public class MyClass
{
   IMyService _myService; 

   public MyClass(IMyService myService)
   {
      _myService = myService;    
   }
}

Без МОК, Ваш класс, который полагается на IMyService, имеет к новому конкретную версию сервиса использовать. И это плохо по ряду причин (Вы связали свой класс с определенной конкретной версией IMyService, Вы не можете модульный тест это легко, Вы не можете изменить его легко, и т.д.)

С контейнером МОК, Вы "настраиваете" контейнер для разрешения тех зависимостей для Вас. Таким образом с основанной на конструкторе инжекционной схемой, Вы просто передаете интерфейс зависимости IMyService в конструктора. При создании MyClass с контейнером контейнер разрешит зависимость IMyService для Вас.

Используя StructureMap, настраивая контейнер похож на это:

StructureMapConfiguration.ForRequestedType<MyClass>().TheDefaultIsConcreteType<MyClass>();
StructureMapConfiguration.ForRequestedType<IMyService>().TheDefaultIsConcreteType<SomeConcreteService>();

Поэтому тому, что Вы сделали, говорят контейнер, "Когда кто-то запрашивает IMyService, дайте им копию SomeConcreteService". И Вы также определили, что, когда кто-то просит MyClass, они получают конкретный MyClass.

Это - весь, контейнер МОК действительно делает. Они могут сделать больше, но это - тяга его - они разрешают зависимости для Вас, таким образом, Вы не имеете к (и Вы не должны использовать "новое" ключевое слово всюду по своему коду).

Заключительный шаг: при создании MyClass Вы сделали бы это:

var myClass = ObjectFactory.GetInstance<MyClass>();

Hope, которая помогает. Не стесняйтесь посылать мне по электронной почте.

6
задан 7 September 2009 в 01:54
поделиться

6 ответов

Это вполне разумный подход. Ваши посетители никогда не смогут редактировать данные сеанса на вашем сервере (если только сам сервер не является небезопасным, и в этом случае честная игра), поэтому значение LoggedIn = 1 в сеансе совершенно безопасно.

Однако сохраняйте имея в виду риск того, что один посетитель захватит сеанс другого (путем кражи сеансового ключа). Один из способов защиты от этого - также сохранить IP-адрес посетителя (из $ _ SERVER ['REMOTE_ADDR'] ) в сеансе, а затем в последующих запросах подтвердить, что он не изменился.

9
ответ дан 8 December 2019 в 18:39
поделиться

Необходимо учитывать ряд рисков:

  1. Захват сеанса: здесь кто-то крадет cookie пользователя и выдает себя за них. Некоторые предложат фильтрацию IP-адресов для противодействия этому, но это может иметь неприятные побочные эффекты. Люди используют веб-сайты с мобильных устройств или ноутбуков, которые используются на работе, дома и в точках доступа Wi-Fi, а также есть другие случаи, когда IP-адреса могут изменяться. Так что мой совет: делайте это только для очень уязвимых веб-сайтов (например, онлайн-банкинга);
  2. Ваш сайт взломан: в этом случае пользователь все равно будет иметь доступ к вашей базе данных, поэтому нет дополнительный риск при хранении аутентификационной информации в сеансе. Они могут так же легко изменить свою личность, выполнив инструкции UPDATE для вашей базы данных;
  3. Совместно размещенный сайт взломан: если вы используете общий хостинг, совершенно не связанный сайт может подвергнуть вас риску (с этой схемой или без нее), потому что несколько сайтов работают на одном экземпляре Apache и, таким образом, могут получить доступ к файлам друг друга (хотя это может быть сложно понять, к какому сайту они принадлежат). Таким образом, если сайт, о котором вы никогда не слышали, взломан, это может повлиять на ваш сайт;
  4. Совместно размещенный сайт является вредоносным: похож на (3), за исключением того, что угроза является внутренней, но в остальном аналогична.

Так что я бы сказал, что это нормально (при условии (2)), но просто помните о рисках. Следуйте, как минимум, этим передовым методам:

  1. Никогда не храните незашифрованные пароли;
  2. Используйте надежный алгоритм хеширования (предпочтительно SHA1 или как минимум MD5);
  3. Убедитесь, что в какой-то момент срок действия cookie аутентификации истечет. Как долго зависит от вашего сайта. Это может быть неделя или две, час или две бездействия или и то, и другое.
3
ответ дан 8 December 2019 в 18:39
поделиться

Рассмотрим SHA1 или даже более сильный хэш вместо MD5. А ты солишь, это хорошо.

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

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

Вы также должны учитывать атаки сеанса. Проверить рефереров. Если у вас катастрофическая операция, назовем ее POST для DeleteMyAccount,

1
ответ дан 8 December 2019 в 18:39
поделиться

Звучит нормально; вы можете подумать об установке времени истечения срока действия (чтобы, если кто-то уйдет и оставит браузер открытым, он тоже не будет в большой опасности).

0
ответ дан 8 December 2019 в 18:39
поделиться

Вы можете использовать COOKIE вместо переменной SESSION. вы можете установить COOKIE, выполнив

setcookie ('ID', $ variable, time () + 8 * 60 * 60);

Вы должны знать о SQL Injection. Когда вы вставляете или обновляете свою базу данных, к которой относится текстовое поле пользователя, помните о SQL Injection. Вставьте / обновите свои значения с помощью функции htmlentities ().

0
ответ дан 8 December 2019 в 18:39
поделиться

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

Кроме того, md5 больше не считается достаточно надежным для хеширования паролей: он слишком быстрый для хеширования, и вы не хотите, чтобы при проверке злоумышленнику приходилось запускать его снова и снова (в то время как реальному пользователю нужно только сделать это один раз). Хотел бы я найти ссылку, но передовая мудрость состоит в том, чтобы сделать много раундов переднего алгоритма хеширования, такого как sha512.

0
ответ дан 8 December 2019 в 18:39
поделиться
Другие вопросы по тегам:

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