Несколько простых шагов:
Черный список определенные общие имена пользователей, и используют их в качестве ловушки. Администратор, гость, и т.д. не позволяет никому создать учетные записи с этими именами, поэтому если кто-то действительно пытается зарегистрировать их в Вас, знают, что это - кто-то делающий что-то, что они не были должны.
Удостоверяются любой, у кого есть действительная мощность на сайте, имеет безопасный пароль. Потребуйте, чтобы у администраторов / модераторы были более длительные пароли с соединением букв, чисел и символов. Отклоните тривиально простые пароли от обычных пользователей с объяснением.
Одна из самых простых вещей, которые можно сделать, говорят людям, когда кто-то пытался войти в их учетную запись и дать им ссылку для создания отчетов об инциденте, если это не были они. Простое сообщение, когда они входят в систему как "Кто-то, пыталось войти в Вашу учетную запись в 4:20 в среду и тому подобное. Щелкните здесь, если это не было Вами". Это позволяет Вам сохранить некоторую статистику по нападениям. Можно повысить мер контроля и мер безопасности, если Вы видите, что существует внезапное увеличение мошеннических доступов.
Предполагая, что это ваш «неизменяемый» объект:
public class Immutable
{
public Immutable(string foo, int bar)
{
this.Foo = foo;
this.Bar = bar;
}
public string Foo { get; private set; }
public int Bar { get; private set; }
}
Вы можете создать фиктивный класс для представления этого неизменяемого объекта во время сериализации / десериализации:
public class DummyImmutable
{
public DummyImmutable(Immutable i)
{
this.Foo = i.Foo;
this.Bar = i.Bar;
}
public string Foo { get; set; }
public int Bar { get; set; }
public Immutable GetImmutable()
{
return new Immutable(this.Foo, this.Bar);
}
}
Когда у вас есть свойство типа Immutable, не сериализуйте его, а вместо этого сериализуйте DummyImmutable:
[XmlIgnore]
public Immutable SomeProperty { get; set; }
[XmlElement("SomeProperty")]
public DummyImmutable SomePropertyXml
{
get { return new DummyImmutable(this.SomeProperty); }
set { this.SomeProperty = value != null ? value.GetImmutable() : null; }
}
Хорошо, это немного длинно для чего-то, что выглядит таким простым ... но это должно работать;)
Неизменяемость Realio-trulio включает в себя конструктор. Неизменяемость Popsicle - это то, что вы можете сделать, например:
Person p = new Person();
p.Name = "Fred";
p.DateOfBirth = DateTime.Today;
p.Freeze(); // **now** immutable (edit attempts throw an exception)
(или то же самое с инициализатором объекта)
Это подходит для DataContractSerializer
достаточно хорошо, если вы обрабатываете сериализованный обратный вызов для выполнения Заморозка
. XmlSerializer
не выполняет обратные вызовы сериализации, поэтому требуется больше работы.
Однако любой вариант подойдет, если вы используете настраиваемую сериализацию ( IXmlSerializable
). Точно так же настраиваемая сериализация в общих чертах выполнима с неизменяемостью realio-trulio, но болезненна - и это немного ложь, поскольку это «создать один раз, затем вызвать метод интерфейса» - так что не совсем правильно неизменяемый.
Для истинной неизменяемости используйте DTO.
Я рекомендую взглянуть на обсуждение здесь: Почему классу XML-Serializable нужен конструктор без параметров .
Вам следует рассмотреть возможность использования DataContractSerializer. Насколько я могу судить из документации, для этого не требуется конструктор без параметров и можно сериализовать / десериализовать частные члены.
Я только что прочитал статью, на которую вы ссылались. В его терминологии объекты, использующие поля только для чтения, инициализированные в конструкторе, называются «неизменяемость только для записи».
«Неизменяемость Popsicle» немного отличается. Липперт приводит два примера того, где это было бы полезно: десериализация (проблема, которую вы пытаетесь решить) и циклические ссылки, где A и B должны быть созданы независимо, но A должна иметь ссылку на B, а B - ссылка на A .
Здесь были упомянуты два более очевидных способа достижения этого результата (фактически, когда я писал это). Шаблон, который упоминает Томас Левеск, в основном является шаблоном «Строитель». Но в данном случае это довольно громоздко, потому что вам нужно не только перейти от Builder к Immutable, но также от Immutable до Builder, чтобы сериализация / десериализация была симметричной.
Таким образом, шаблон «блокировки», как упомянул Марк Гравелл, кажется более полезным. Я не знаком с C #, поэтому не знаю, как лучше его реализовать. Я думаю, что частная собственность типа заблокирована . Затем всем методам получения необходимо явно проверить, заблокирован ли объект (он же «заморожен»). В таком случае они должны генерировать исключение (это ошибка времени выполнения; вы не можете принудительно установить неизменяемость popstick во время компиляции).
Затем всем методам получения необходимо явно проверить, заблокирован ли объект (он же «заморожен»). В таком случае они должны генерировать исключение (это ошибка времени выполнения; вы не можете принудительно установить неизменяемость popstick во время компиляции). Затем всем методам получения необходимо явно проверить, заблокирован ли объект (он же «заморожен»). В таком случае они должны генерировать исключение (это ошибка времени выполнения; вы не можете принудительно установить неизменяемость popstick во время компиляции).