У Robert Martin есть превосходное статья о принципе замены Лисков . Это обсуждает тонкие и not-so-subtle пути, которыми может быть нарушен принцип.
Некоторые соответствующие части статьи (отмечают, что второй пример в большой степени сжат):
А Простой Пример Нарушения LSP
Одно из самых явных нарушений этого принципа является использованием Информации о типах во время выполнения (RTTI) C++ для выбора функции, основанной на типе объекта. т.е.:
void DrawShape(const Shape& s) { if (typeid(s) == typeid(Square)) DrawSquare(static_cast
(s)); else if (typeid(s) == typeid(Circle)) DrawCircle(static_cast (s)); } Очевидно эти
DrawShape
функция плохо формируется. Это должно знать о каждой возможной производнойShape
класс, и это должно быть изменено каждый раз, когда новые производныеShape
создаются. Действительно, многие просматривают структуру этой функции как анафема на Объектно-ориентированное проектирование.Квадрат и Прямоугольник, Более тонкое Нарушение.
Однако существуют другие, намного более тонкие, способы нарушить LSP. Рассмотрите заявление, которое использует
Rectangle
класс, как описано ниже:class Rectangle { public: void SetWidth(double w) {itsWidth=w;} void SetHeight(double h) {itsHeight=w;} double GetHeight() const {return itsHeight;} double GetWidth() const {return itsWidth;} private: double itsWidth; double itsHeight; };
[...] Предполагают, что однажды пользователи требуют способности управлять квадратами в дополнение к прямоугольникам. [...]
Очевидно, квадрат является прямоугольником для всех нормальных намерений и целей. Так как отношения ISA содержат, логично смоделировать
Square
класс, как получаемый отRectangle
. [...]
Square
наследуетсяSetWidth
иSetHeight
функции. Эти функции являются совершенно несоответствующими дляSquare
, так как ширина и высота квадрата идентичны. Это должно быть значительной подсказкой, что существует проблема с дизайном. Однако существует способ обойти проблему. Мы могли переопределитьSetWidth
иSetHeight
[...], Но рассмотреть следующую функцию:
void f(Rectangle& r) { r.SetWidth(32); // calls Rectangle::SetWidth }
, Если мы передаем ссылку на
Square
объект в эту функцию, этиSquare
, объект будет поврежден потому что высота won’t быть измененным. Это - четкое нарушение LSP. Функция не работает на производные своих аргументов.[...]
I allow myself to be guided by OWASP here:
They are unacceptable for the following reasons:
Collection of information about people without their explicit consent (such as "Mother's maiden name") is illegal in most privacy regimes. Such collection is subject to privacy laws, review and correction by the subject, and so on.
IT Security Policies and standards such as ISO 27000 prohibit the clear text storage of passwords, but almost all Q&A schemes store both the question and answer in the clear
The information in the answers is public for a goodly portion of the users of the Internet, and thus is found using public sources
Edit (2018): OWASP seems to have re-arranged their materials. The wayback machine captured a copy of the original page.
Пароли - это ответы на «секретный» вопрос. Это вопрос: «Какой у вас пароль?».
Как указывает Сканлифф, добавление дополнительного поля для ввода пользователем может или не может повысить безопасность пароля - это зависит от действий пользователя.
Я бы сказал, что комбинация секретный вопрос / ответ - это просто еще одна форма «пароля». Затем я бы предположил, что секретный ответ , вероятно, слабее, чем обычный пароль, так как редко есть предложения, что это должно быть что-то, кроме обычных слов, уязвимых для словарных атак. В большинстве случаев словарное пространство ответа значительно сокращается из-за контекста вопроса (однако, отмечено исключение Сканлиффа).
Идиома вопросов и ответов использовалась во многих опубликованных «хакерских атаках на электронную почту» ( пример ) - я бы, конечно, избегал ее использования.
На одном сайте, на котором я был (банк или страхование здоровья), мне требовалось ответить на шесть секретных вопросов. Для сброса пароля они выберут три из них наугад и потребуют от меня ответа.
Кроме того, я предполагаю, что они будут хранить только хешированные ответы, а не текстовую версию. Как сказал DDaviesBrackett , пароль - это секретный вопрос.
Мне кажется, что часть вашего вопроса упускают из виду. Потому что, как и вы, я вижу, как мы каким-то образом упускаем из виду здравый смысл, что если вы не должны хранить их пароль в виде обычного текста, но вы готовы сохранить их ответ на их `` секретный вопрос '' в виде обычного текста, а затем позволить им сбросить свой пароль через Ссылка, отправленная по электронной почте, почему даже есть секретный вопрос и просто отправьте им ссылку для сброса. Конечно, вы можете так же легко зашифровать ответ на вопрос.
Кажется, что многие люди, в том числе и я, пишут свой вопрос / ответ в каком-то зашифрованном виде, где вопрос не дает подсказки, но я всегда спрашиваю себя, когда создаю их - «если я не помню пароль который я буду использовать каждый раз, когда захожу на этот сайт,
i would use a secret question to determine if I should or shouldn't send them a newly generated password via an email. Never to let them set a new one. At the end of the day though, it all comes down to make it as secure as it needs to be. If you're an online bank or a networking site makes a huge difference.
Это также зависит от того, насколько связаны секретный вопрос / ответ.
Показательный пример, когда мне предоставляется возможность задать вопрос, я ввел что-то вроде:
Question: Groovy Broccoli?
Answer: International Space Station 431
Это не настоящие вопросы / ответы, которые я использую, но могу заверить вас, что вопросы, которые я использую, не дают никакого ключа к ответу.
Если вы можете войти в систему, используя секретный вопрос, то эта система так же безопасна, как и метод, с помощью которого сохраняется секретный вопрос.
Однако, если пользователь использует тот же пароль в других системах, то, по крайней мере, хеширование пароля предохраняет его от использования в других системах, например в его онлайн-банке.
Суть защиты секретного вопроса обычно заключается в альтернативном надежном средстве связи. Если пользователь правильно отвечает на «секретный вопрос», сервер должен предоставить случайный пароль через доверенный канал (например, адрес электронной почты).
Затем, используя этот случайный пароль (который так же безопасен, как и электронная почта пользователя), он может использовать его для входа в систему и изменения пароля на другой.
Это зависит от требований безопасности, которые вам требуются ... И как только они уже ответят на эту часть.
Единственное, что я должен добавить, это то, что вы используете шифрование MD5 для хранения паролей и другие конфиденциальные данные. Имейте в виду, что в настоящее время практически невозможно обнаружить «фразу», зашифрованную с помощью MD5. Вы можете найти множество статей об этом. И не сложно реализовать в ваших проектах.
С уважением. Фабио Антунес
"Greetings, Professor Falken." or why it is not a good idea to base any authentication scheme on non-secret, non-random-"ish" responses.
And, if you try to be a little tricky and choose random-"ish" responses to the notorious maiden-name-questions and are able to remember them AFTER you have forgotten your password (and probably have changed it a few times since setting the "secret question".
Nay, the whole secret-questions scheme is botched from the start. For a start, the question is not secret but revealed to anybody claiming to have mislaid your password.
Я бы также порекомендовал начать с реализации VCS (системы контроля версий) для самостоятельно . Я бы рекомендовал использовать одну из распределенных VCS (Git, Mercurial, Bazaar) вместо централизованной Subversion, потому что было бы проще создать центральный репозиторий (или репозитории) путем клонирования, чем перемещать репозиторий Subversion в центральное место . Распределенный SCM также может использоваться в небольшой группе для обмена идеями.
Несколько преимуществ (современных) систем управления версиями:
Вы всегда можете вернуться ( вернуться ) к последней рабочей версии ваш код (при условии, что вы соблюдаете некоторые разумные соглашения об управлении версиями, например, по крайней мере, помечаете только проверенный код). При использовании общего кода через папки может оказаться, что ни одна версия не работает, резервные копии были удалены для экономии места, Если кто-то что-то знает о вас, он может ответить на простой вопрос и сбросить ваш пароль. Я предполагаю, что ответы также хешируются, поэтому ответ напрямую не сохраняется. Но опять же, знать ответ на вопрос - это все, что нужно.
Хранимый хешированный пароль настолько же безопасен, насколько и большинство приложений, и это нормально, потому что это односторонний способ, и, следовательно, простой текст никогда не сохраняется и не может получено.