Единицей является просто МОК "контейнер". 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, которая помогает. Не стесняйтесь посылать мне по электронной почте.
Это вполне разумный подход. Ваши посетители никогда не смогут редактировать данные сеанса на вашем сервере (если только сам сервер не является небезопасным, и в этом случае честная игра), поэтому значение LoggedIn = 1 в сеансе совершенно безопасно.
Однако сохраняйте имея в виду риск того, что один посетитель захватит сеанс другого (путем кражи сеансового ключа). Один из способов защиты от этого - также сохранить IP-адрес посетителя (из $ _ SERVER ['REMOTE_ADDR']
) в сеансе, а затем в последующих запросах подтвердить, что он не изменился.
Необходимо учитывать ряд рисков:
Так что я бы сказал, что это нормально (при условии (2)), но просто помните о рисках. Следуйте, как минимум, этим передовым методам:
Рассмотрим SHA1 или даже более сильный хэш вместо MD5. А ты солишь, это хорошо.
Возвращаясь к твоему вопросу: да, это нормально. Однако примите меры, чтобы сеансы не были перехвачены. В Википедии на самом деле есть довольно хорошая статья .
В большинство написанных мной систем я включил логику для проверки того, что удаленный IP-адрес не изменился. Вы также можете сохранить это в сеансе, поскольку переменные сеанса не передаются пользователю (только идентификатор сеанса). Если вы действительно хотите проявить творческий подход, вы можете добавить другие проверки - пользовательский агент и другие.
Вы также должны учитывать атаки сеанса. Проверить рефереров. Если у вас катастрофическая операция, назовем ее POST для DeleteMyAccount,
Звучит нормально; вы можете подумать об установке времени истечения срока действия (чтобы, если кто-то уйдет и оставит браузер открытым, он тоже не будет в большой опасности).
Вы можете использовать COOKIE вместо переменной SESSION. вы можете установить COOKIE, выполнив
setcookie ('ID', $ variable, time () + 8 * 60 * 60);
Вы должны знать о SQL Injection. Когда вы вставляете или обновляете свою базу данных, к которой относится текстовое поле пользователя, помните о SQL Injection. Вставьте / обновите свои значения с помощью функции htmlentities ().
В целом вы определенно на правильном пути. Я бы порекомендовал вам использовать идентификаторы для ваших пользователей в сеансе, а не имя пользователя, поскольку идентификаторы - лучшая уникальная ссылка внутри вашего кода.
Кроме того, md5 больше не считается достаточно надежным для хеширования паролей: он слишком быстрый для хеширования, и вы не хотите, чтобы при проверке злоумышленнику приходилось запускать его снова и снова (в то время как реальному пользователю нужно только сделать это один раз). Хотел бы я найти ссылку, но передовая мудрость состоит в том, чтобы сделать много раундов переднего алгоритма хеширования, такого как sha512.