My name is Vasyl Khrystiuk‎ > ‎process‎ > ‎main‎ > ‎

2 Risks in web-aps


Структура цикла:
  1. Intro - о чем вообще речь
  2. Risks in web-apps
  3. Java app security - что ява предлагает из коробки для защиты приложений
  4. j2ee webapp security - что ява предлагает из коробки для защиты веб приложений
  5. Auth and auth flow, remember me, access managers models(role-based, unix fs ownership based, vote-based)
  6. custom auth framework
  7. spring security and friends(Apache Shiro)









Ресурсы:

http://oisd.sergeybelove.ru/materials

и прочие форумы
https://rdot.org/forum/
http://securityoverride.org/challenges/
http://habrahabr.ru/company/pentestit/blog/240995/
таки да, паблики вконтпкте: https://vk.com/bo0om_ru




https://www.owasp.org/index.php/Main_Page
https://www.owasp.org/index.php/Category:Attack

https://www.owasp.org/index.php/Projects/OWASP_Code_Review_Project
https://www.owasp.org/index.php/Category:OWASP_Code_Review_Project
https://www.owasp.org/images/2/2e/OWASP_Code_Review_Guide-V1_1.pdf
https://www.owasp.org/images/5/58/OWASP_ASVS_Version_2.pdf

http://www.slideshare.net/MasoudKalali/utilize-the-full-power-of-glassfish-server-and-java-ee-security
Ross+Anderson’s+Security+Engineering
http://library.back2hack.cc/books/

http://projects.webappsec.org/


    Ниже будет список аспектов, о которых надо знать при создании безовасного веб приложения. 
    Кстати, в этот список попали все 10 из 10 топ уязвимостей за версией OWASP(https://www.owasp.org/index.php/Top_10_2010-Main), но я их не выделил, ибо остальные так же опасны. И не смотря на то, что на сайте OWASP есть и объяснения, и инструкции:
некоторые из проблем там выделены несправедливо слабо. К тому же у меня есть примечания к некоторым пунктам. 

Потому, аспекты защиты:


Contents

  1. 1 Что такое POST что такое GET(еще раз)
  2. 2 DOS
  3. 3 Хотлинктнг
  4. 4 Автоматические регистрации
  5. 5 Пароль
  6. 6 Контроль доступа
  7. 7 Что такое CORS и CSP
  8. 8 Валидация пользовательского ввода
  9. 9 XXS
  10. 10 Виды аутентификаций
  11. 11 Перехват сессий
  12. 12 Дефейс
  13. 13 Загрузка файлов
  14. 14 просто смени буковку в URL
  15. 15 Дефолтный домен - он настроен?
  16. 16 Null Byte
  17. 17 XPath in URL
  18. 18 Привет, шаблонизатор!
  19. 19 Говорящие ошибки
  20. 20 LFI и RFI
  21. 21 Белый список, принцип минимальных привилегий
  22. 22 bypass logic (и отношение к ошибкам)
  23. 23 Хранение персональных данных(паролей) на серверах
  24. 24 HTTPS - но зачем. История об асимметричных ключах и цепочке доверия.
  25. 25 Критические действия с аккаунтом пользователя
  26. 26 Работа с персональными данными на примере электронных карт.
  27. 27 Ошибки безопасности в плагинах браузера
  28. 28 Завершение сессии и "remember me"
  29. 29 SQL и друзья
  30. 30 Транзации
  31. 31 Моя проблема не в тебе
  32. 32 Добавь один чтоб получить меньшее
  33. 33 Пароль строкой в памяти - шутка, которая почему-то больше не смешная
  34. 34 Модерация контента
  35. 35 Вывод


Что такое POST что такое GET(еще раз)

  • "In particular, the convention has been established that the GET and HEAD methods SHOULD NOT have the significance of taking an action other than retrieval." - rfc2616.

DOS

  • DOS
  • DDOS
  • висячие соединения(Slow HTTP POST)
  • проксирующие сервера - prof and cons

Хотлинктнг

Привет антилич, хотлинкинг

Автоматические регистрации


Пароль

  • Зачем нужен стойкий пароль. Защита от подбора. 
  • Восстановление пароля

Контроль доступа

  • Пользователи, группы и роли

Что такое CORS и CSP

content-security-policy-report-only-header-field

Access-Control-Allow-Origin
https://www.owasp.org/index.php/HTML5_Security_Cheat_Sheet


Все что ниже - можно протестить без ломания всего: 
этот заголовок немного ОТЛИЧАЕТСЯ от рабочего и призван для тестирования.

Ок, что у меня есть:
1) синтаксис. смотри на этот синтаксис внимательно:
default-src 'none'; script-src 'self'; connect-src: 'self'; img-src: 'self'; style-src: 'self';
Видишь? Так вот:
  • там нет никаких ":" внутри
  • все элементы разделены с помощью  ";"
Вот википедия: http://en.wikipedia.org/wiki/Content_Security_Policy (ничего интересного кроме как о поддержке браузеров)
тут более менее все, странно что мне этого не хватило http://content-security-policy.com/
Вот оригинальная дока: http://www.w3.org/TR/CSP/ (оригинальней не найти)

default-src  - директива, которая используется по умолчанию, если другие не используются
Другие:
  • script-src (особенности - наличие 'unsafe-inline' и  'unsafe-eval' )
  • object-src
  • style-src
  • img-src
  • media-src
  • frame-src
  • font-src
  • connect-src

Дальше:


Так вот - есть возможность исключить появление скриптов на странице и вынести их всех в внешние скрипты. Но тогда постает логичный вопрос: как быть с данными, которые скрипты получают для своей работы со страницы, ведь если до этого они инициализировалась  в инлайн скриптах, то теперь этого не сделаешь. Впрочем, и для этого есть решение:
Даже гугл аналитикс можно вынести:
То же самое, компактней: http://nmatatal.blogspot.com/2013/01/removing-inline-javascript-for-csp.html
Ну и понятно, что данные нужно ескейпить для атрибутов HTML. Сделать можно любой библиотекой (например: org.springframework.web.util.HtmlUtils) или даже взять код нужной функкции: http://stackoverflow.com/questions/655746/


А вот и тот хеадер, с которым у меня все заработало:
header("X-XSS-Protection: 0");

Пока все. 
И вот  еще(почитать на досуге): http://habrahabr.ru/post/149152/


Валидация пользовательского ввода

  • XXS
  • SQL-inj
  • NULL BYTE
  • фреймы
  • ява-аппреты
  • флеш(из которого как минимум можно вызвать яваскрипт)

  • фильтрация пользовательского ввода в случае WYSIWYG
    • + белый список тегов
    • + SRC URL должны быть валидными(проверка на домен, путь)
    • + обработка атрибута style для очистки от неверных URL SRC

1) Концепция
2) Реализация в java


Теперь, что здесь будет описано в первую очередь.
WYSIWYG-редакторы это очень классная опция  - она позволяет пользователям писать форматированный текст. Но это целая дыра в безопасности, ведь по сути мы даем пользователю отправить на сайт HTML, и никто не гарантирует что вместе с тем HTML там не будет активного содержимого.

Сразу определимся на что будем тестить:
1) <script> тег  <script>alert(1)</script>
2) on<EventName> атрибуты - <img src=:x onerror=alert(/xxs/.source)>
3) <META HTTP-EQUIV=Refresh CONTENT="1; URL=javascript:alert(/xxs/.source)">
4) <input onfocus=alert(/xxs/.source) autofocus>
5) <frameset onload=alert(1)>
6) <DIV STYLE="width: expression(alert('XSS'));"> - думаю с этим нужно просто не принимать сообщения, так как отпарсить такое трудно(а вероятность случайного появления в вводе равна нулю), 
7) <DIV STYLE="background-image: url(javascript:alert('XSS'))"> и вообще я бы не верил "background-image" с другого домена.
8) null byte injection (можно самому исправить заменой "\0" на "")
... выбрать еще

Так же нам нужно контролировать происхождение ресурсов(например картинок), которые использует пользователь.

Теперь, какие есть решения.
Что касается организации безопасности, то очень интересный проект OWASP, который ставит своей целью систематизировать решения в области защиты информации. И должен сказать, что движение очень активное - к ним например присоединились создатели сайта ha.ckers.org/xss.htmlконвертерами которых мне приходилось пользоваться.
Беглый поиск по OWASP дал мне такие результаты для явы:
еще не понял что это, но что-то есть:          https://code.google.com/p/owasp-esapi-java/ 
очень похоже на то, что мне нужно:            https://code.google.com/p/owasp-java-encoder/
еще один кандидат:                                      https://code.google.com/p/owasp-java-html-sanitizer/
Cleaner от Jsoup(пр):                                      https://github.com/jhy/jsoup/blob/master/src/main/java/org/jsoup/safety/Cleaner.java
Кандидат:                                                        http://josephoconnell.com/java/xss-html-filter/source/
кандидат:                                                        http://jtidy.sourceforge.net/index.html
кандидат:                                                        http://htmlcleaner.sourceforge.net/javause.php

Выводы:
  • UPD: самым подходящим по функционалу оказался один из корневых проектов OWASP - они позволяют использовать целые наборы правил, и у них есть парсер css свойств, вплоть до определения источника ресурсов(и с возможностью указывать свой.) Вообщем описание здесь: https://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project
    код здесь: https://code.google.com/p/owaspantisamy/
  • Самим удобным, актуальным и главное - расширяемым решением я вижу  owasp-java-html-sanitizer, его и буду использовать.
  • Так же довольно практичный и актуальный Cleaner от Jsoup, но в нем неучтенные некоторые моменты и к тому же он немного труднее расширяем, чем предыдущий кандидат, хотя и в принципе реализовывает схожую логику. 
  • htmlcleaner тоже похож на актуальный, но в нем нет нужной мне логики. 
  • owasp-esapi-java это круто но не то, что нам надо.
  • xss-html-filter просто стар, написан в не очень удобном виде и тоже не реализовывает нужной логики. 
  • jtidy написан в 2004 году, сказать что он не очень актуален это ничего не сказать. 






1. Как улучшить проверку аргументов и заменить

if (dst == null)
throw new ArgumentNullException(”dst”);

if (src == null)
throw new ArgumentNullException(”src”);

if (dstOffset + length > dst.Length || dstOffset < 0)
throw new ArgumentOutOfRangeException(
“dst, dstOffset, length”,
string.Format(”dst range is not within bounds, ({0} + {1}) > {2}”, dstOffset, length, dst.Length));

if (srcOffset + length > src.Length || srcOffset < 0)
throw new ArgumentOutOfRangeException(
“src, srcOffset, length”,
string.Format(”src range is not within bounds, ({0} + {1}) > {2}”, srcOffset, length, src.Length));

if (length < 0)
throw new ArgumentOutOfRangeException(”length”, “length must be >= 0, ” + length.ToString());

на

Validate.Begin()
.IsNotNull(dst, “dst”)
.IsNotNull(src, “src”)
.Check()
.IsPositive(length)
.IsIndexInRange(dst, dstOffset, “dstOffset”)
.IsIndexInRange(dst, dstOffset + length, “dstOffset + length”)
.IsIndexInRange(src, srcOffset, “srcOffset”)
.IsIndexInRange(src, srcOffset + length, “srcOffset + length”)
.Check();

без выделения объектов в случае отсутствия исключений.

Зацікавився питанням, знайшов шось вражаюче(http://forums.informationbuilders.com/eve/forums/a/tpc/f/7971057331/m/7311082762):
function validDate(fld) { var RegExPattern = /^((((0?[1-9]|[12]\d|3[01])[\.\-\/](0?[13578]|1[02])[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|[12]\d|30)[\.\-\/](0?[13456789]|1[012])[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|((0?[1-9]|1\d|2[0-8])[\.\-\/]0?2[\.\-\/]((1[6-9]|[2-9]\d)?\d{2}))|(29[\.\-\/]0?2[\.\-\/]((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00)))|(((0[1-9]|[12]\d|3[01])(0[13578]|1[02])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|[12]\d|30)(0[13456789]|1[012])((1[6-9]|[2-9]\d)?\d{2}))|((0[1-9]|1\d|2[0-8])02((1[6-9]|[2-9]\d)?\d{2}))|(2902((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)|00))))$/; var errorMessage = 'Please enter valid date as day, month, and four digit year.\nYou may use a slash, a hyphen or a period to separate the date parts.'; if ((fld.match(RegExPattern)) && (fld!='')) { return true; } else { alert(errorMessage); } }

Вникати в суть написаного немає бажання. Хай це просто буде тут як приклад того, як робити не треба.


http://commons.apache.org/validator/ - Для серйозних задач з валідацією в яві це було б найбільш правильним рішенням.

Також сподобалось ось це рішення:
package hirondelle.fish.main.resto;

import hirondelle.web4j.model.ModelCtorException;
import hirondelle.web4j.model.ModelUtil;
import hirondelle.web4j.model.Id;
import hirondelle.web4j.security.SafeText;
import hirondelle.web4j.model.Decimal;
import static hirondelle.web4j.model.Decimal.ZERO;
import hirondelle.web4j.model.Check;
import hirondelle.web4j.model.Validator;
import static hirondelle.web4j.util.Consts.FAILS;

/** Model Object for a Restaurant. */
public final class Resto {

  /**
   Full constructor.
    
   @param aId underlying database internal identifier (optional) 1..50 characters
   @param aName of the restaurant (required), 2..50 characters
   @param aLocation street address of the restaurant (optional), 2..50 characters
   @param aPrice of the fish and chips meal (optional) $0.00..$100.00
   @param aComment on the restaurant in general (optional) 2..50 characters
  */
  public Resto(
    Id aId, SafeText aName, SafeText aLocation, Decimal aPrice, SafeText aComment
  ) throws ModelCtorException {
    fId = aId;
    fName = aName;
    fLocation = aLocation;
    fPrice = aPrice;
    fComment = aComment;
    validateState();
  }
  
  public Id getId() { return fId; }
  public SafeText getName() {  return fName; }
  public SafeText getLocation() {  return fLocation;  }
  public Decimal getPrice() { return fPrice; }
  public SafeText getComment() {  return fComment; }

  @Override public String toString(){
    return ModelUtil.toStringFor(this);
  }
  
  @Override public  boolean equals(Object aThat){
    Boolean result = ModelUtil.quickEquals(this, aThat);
    if ( result ==  null ) {
      Resto that = (Resto) aThat;
      result = ModelUtil.equalsFor(
        this.getSignificantFields(), that.getSignificantFields()
      );
    }
    return result;
  }
  
  @Override public int hashCode(){
    if ( fHashCode == 0 ){
      fHashCode = ModelUtil.hashCodeFor(getSignificantFields());
    }
    return fHashCode;
  }
  
  // PRIVATE //
  private final Id fId;
  private final SafeText fName;
  private final SafeText fLocation;
  private final Decimal fPrice;
  private final SafeText fComment;
  private int fHashCode;
  
  private static final Decimal HUNDRED = Decimal.from("100");

  private void validateState() throws ModelCtorException {
    ModelCtorException ex = new ModelCtorException();
    if ( FAILS == Check.optional(fId, Check.range(1,50)) ) {
      ex.add("Id is optional, 1..50 chars.");
    }
    if ( FAILS == Check.required(fName, Check.range(2,50)) ) {
      ex.add("Restaurant Name is required, 2..50 chars.");
    }
    if ( FAILS == Check.optional(fLocation, Check.range(2,50)) ) {
      ex.add("Location is optional, 2..50 chars.");
    }
    Validator[] priceChecks = {Check.range(ZERO, HUNDRED), Check.numDecimalsAlways(2)};
    if ( FAILS == Check.optional(fPrice, priceChecks)) {
      ex.add("Price is optional, 0.00 to 100.00.");
    }
    if ( FAILS == Check.optional(fComment, Check.range(2,50))) {
      ex.add("Comment is optional, 2..50 chars.");
    }
    if ( ! ex.isEmpty() ) throw ex;
  }
  
  private Object[] getSignificantFields(){
    return new Object[] {fName, fLocation, fPrice, fComment};
  }
}
// Ну і понятно, шо якшо ми викидаєм exeption з конструктора, то об'єкт не створюється. (ну і ловим далі exeption ).
// UPD: Є багато причин, по яикх не можна викидати ексепшин з конструктора, хоча цей прийом іноді використовується в стандартній бібліотеці:
// http://abc.vvsu.ru/Books/u_programm/page0060.asp
// і не дивлячись на все сказане - правильне рішення ресурсів в поламаному конструкторі тут:


 На це можна звернути увагу, але не думаю що це універсальне рішення. Зате 
if ( FAILS == Check.optional(fLocation, Check.range(2,50)) ) {
      ex.add("Location is optional, 2..50 chars.");
    }
має якусь таки унірерсальність, спрощення рутинності і добавлення абстрактності.
Assertions.isNotNull("configLocation", configLocation);// throws NullArgumentException
Як варіант.



XXS

https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet

  • active

  • pasive
    • < a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgvWFNTLyk8L3NjcmlwdD4=">lol</a>
  • dom-based


CSFR
что такое CSRF


Виды аутентификаций

форма - логин пароль
базовая - запрос сервера
дайжест
сертификаты
....
....

Перехват сессий

Оригинальный документ:

https://www.owasp.org/index.php/Top_10_2010-A3-Broken_Authentication_and_Session_Management


    В общем случае все проблемы с кражей сессией можно решить, ограничив использование сессии только определенным IP-адресом и привязав к браузеру(название/версия). Но к сожалению этот способ имеет такой недостаток, что люди с динамическим IP-адресом  не смогут пользоваться сайтом.  Так же непонятно, как работать с пользователями, которые находятся за NAT(http://stackoverflow.com/a/7550915/449553).  Потому, хотя это работает, но должно использоваться только тогда, когда недостатки метода перевешивают преимущества. Если сервис для "людей", то это никогда не должно быть сделано так. 


Подвид атаки:
Session Fixation - использование "отравленного" идентификатора сессии.
http://www.acros.si/papers/session_fixation.pdf
http://shiflett.org/articles/session-fixation
Как защититься: 
Во время процесса логина пользователя ДОЛЖНА создаваться новая сессия, тогда использование отравленной будет невозможно. 
Недостатки решения: нет недостатков

Session Hijacking - кража существующего идентификатора сессии

The attacker can get user's session id for example by guessing it (Session Prediction), sniffing
transmission (Session Sniffing), browsing session storage (Session Exposure), using Cross-Site
Scripting (XSS) or reading it from HTTP_REFERER header.

Есть несколько видов кражи, и соответственно разные способы защититься от него:

Session Sniffing - кража идентификатора сессии во время передачи по сети(“man-in-the-middle”).
Как защититься: 
Использовать защищенное соединение все время. 
Недостатки решения: 
См раздел об HTTPS

Session Prediction - банальное угадывание идентификатора сессии( bruteforce,  id генерится предугадываемыми алгоритмами, слишком короткий либо вообще генерируется последовательно. 
Как защититься: 
использовать действительно случайный идентификатор сессии, убедиться что контейнер/фреймворк это предоставляет
Недостатки решения: 
недостатков нет, в общем случае можно изменить механизм управления сессиями, если существующее решение не соответствует требованиям

Session Exposure - 




Заключение по аспекте:
  • при логине производить создание новой сессии
  • использовать https, если не всюду, то хотя бы во время логина
  • привязывать IP к сессии ТОЛЬКО В ОЧЕНЬ ИСКЛЮЧИТЕЛЬНЫХ СЛУЧАЯХ
  • убедится в невозможности угадать идентификатор сессии
  • куки должны быть http-only

Дефейс

Загрузка файлов


о загрузке файлов на сервер(и о протоколе передачи файлов)
права на директориях

просто смени буковку в URL

  • как ресурсы попадают в гугл и пару слов об robots.txt
  • случайное число, которое совсем не случайное 
  • почему твоя админка находится по адресу /admin, а панель управления базой по /phpmyadmin
    • а база доступна всем и находится на 3306 порту
    • и существует дефолтный пользователь
    • и включена альтернативная(от сервера) система авторизации 
  • index.html index2.html index2.1.html
  • directory listing
  • directory traversal
  • Unvalidated Redirects and Forwards (отсутствие неконтролируемого перенаправления (тоже считается уязвимостью, http://security.stackexchange.com/questions/22925/are-open-redirects-a-security-concern ))

  • Path Disclosure (в яве эта проблема решается помещением спорного контента внутрь WEB-INF)

Дефолтный домен - он настроен?


Null Byte

И другие приключения malformed HTTP request

XPath in URL

Привет, шаблонизатор!

Говорящие ошибки

https://www.owasp.org/index.php/Information_Leakage
Information Disclosure

LFI и RFI

Code Execution и JSP

Белый список, принцип минимальных привилегий

bypass logic (и отношение к ошибкам)

Хранение персональных данных(паролей) на серверах


И о хэшах
http://forum.xaknet.org/showpost.php?p=73283&postcount=10

HTTPS - но зачем. История об асимметричных ключах и цепочке доверия.


1) Теория - криптография, автентичность и прочие. Должно закончится на том, что если у нас есть подтвержденный ключ, мы можем верить контенту по ту сторону. 
2) Цепочки доверия, или почему каждый из нас не ходит лично по организациях, выдающие ключи.
3) Недостатки
4) Реализация в яве


Существуют браузеры, которые не поддерживают HTTPS(сколько таких - тот еще вопрос)
Производительность будет низкая, особенно при скачивании больших файлов
А вот пожалуй самое интересное(скопировал полностью): 

In addition to the other reasons (especially performance related) you can only host a single domain per IP address* when using HTTPS.

A single server can support multiple domains in HTTP because the Server HTTP header lets the server know which domain to respond with.

With HTTPS, the server must offer its certificate to the client during the initial TLS handshake (which is before HTTP starts). This means that the Server header hasn't been sent yet so there is no way for the server to know which domain is being requested and which certificate (www.foo.com, or www.bar.com) to respond with.


*Footnote: Technically, you can host multiple domains if you host them on different ports, but that is generally not an option. You can also host multiple domains if your SSL certificate is has a wild-card. For example, you could host both foo.example.com and bar.example.com with the certificate * .example.com


Вот еще одно, другое (http://stackoverflow.com/a/1362320/449553):
This also means that you'll need separate SSL certificates for each host name that you use (e.g. images.example.com ) or some sort of wild card SSL certificate (e.g. for *.example.com).



Вот еще один пример расчета стоимости и проблем полного перевода сервиса на HTTPS:
Кратко это можно перечислить так: http://stackoverflow.com/a/2745920/449553

HTTPS means :

  • You need a server configured properly
  • You need a certificate on your server
    • And, to not get a warning in the browser, you need a certificate signed by some trusted authority
    • And this costs a bit of money
  • A small bit of performance impact
    • The server has to crypt the data
    • The client has to de-crypt it
  • I would bet HTTPS means less caching
    • Maybe on the client side ?
    • And, most probably, on proxies ?

If you don't need HTTPS... Well, why use it ?


Конечно, ущерб  от кражи сессии ниже чем ущерб от кражи авторизационных данных, потому если откинуть многие вторичные факторы, то именно авторизация должна происходить только по HTTPS

Не надо забывать, что нет универсального решения, и всегда может случиться что-то не так(баги в реализации SSL, подмена корневых сертификатов на клиенте, прочее и https://www.grc.com/sn/sn-217.htm прочее)


Еще немного о перфомансе: http://stackoverflow.com/questions/149274/http-vs-https-performance

и об самом протоколе: http://publib.boulder.ibm.com/tividd/td/ITAME/SC32-1363-00/en_US/HTML/ss7aumst18.htm

 (но надо больше)



Хорошая идея для имплементации: http://stackoverflow.com/a/15348666/449553

Критические действия с аккаунтом пользователя

Работа с персональными данными на примере электронных карт.

Ошибки безопасности в плагинах браузера

Завершение сессии и "remember me"

google.com/search?q=stackowerflow+remember+me+with+dynamic+ip

SQL и друзья

(больны все - например точка в свойстве объекта из объектной базы)(загрузка модулей)

Транзации

И числа в том числе

Моя проблема не в тебе

, или проблемы в используемых библиотеках
базы уязвимостей
http://www.exploit-db.com/
...

Добавь один чтоб получить меньшее

  • И даты так же: 32 декабря это реально
  • немного о числах, или почему тут одна корректная операция суммирования: 1e-1+2e-1, но результат все равно неожиданный
  • отрицательные числа - валидные числа, но не валидные значения

Пароль строкой в памяти - шутка, которая почему-то больше не смешная

Модерация контента

  • Спам
  • Запрещенные законом материалы
    • региональные ограничения
  • анализ активности пользователей(поведение, не свойственное пользователю)
  • превентивные меры(на примере википедии)


Вывод


панацеи нет, всегда есть рису
В конце все нужно будет проверить через сканеры безопасности. И многое другоеМногое.




https://www.google.ru/search?hl=ru&q=csfr+glassfish&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&lr=&gws_rd=ssl

ужас
https://java.net/projects/jersey/sources/code/content/core-server/src/main/java/org/glassfish/jersey/server/filter/CsrfProtectionFilter.java?rev=43e54a7bee997e8a295239965f7bd7da8937ec0e

https://java.net/projects/jersey/sources/svn/content/trunk/jersey/jersey-server/src/main/java/com/sun/jersey/api/container/filter/CsrfProtectionFilter.java?rev=5392

на что они надеются:
https://www.google.ru/search?hl=ru&q=csfr+X-Requested-By&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&lr=&gws_rd=ssl

почему это не работает:
https://andrepetukhov.wordpress.com/2011/02/09/csrf-%D0%B2-%D0%BE%D0%B1%D1%85%D0%BE%D0%B4-x-requested-with/
http://lists.webappsec.org/pipermail/websecurity_lists.webappsec.org/2011-February/007533.html
даже РУБИ выпустило патч для этого
http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails/

но не j2ee
ИНТРЕЙПРАЙС СИРВЕРОВ ЭТО НЕ КАСАИТСЯ


тут правда сноска по аяксу
http://stackoverflow.com/questions/3315914/is-this-sufficient-to-protect-against-a-csrf-for-an-ajax-driven-application

но вы же знаете, что если кто-то разрешает кроссдоменный аякс, то он как правило, не ограничивает себя в источниках
но этот вопрос очень спорный
в идеале мы даже не должны прийти к такой ситуации, ибо все неправильные запросы должны быть отсеяны еще на этапе проверки same origin/ CORS allowed origin

вот еще размышления по этому вопросу:
http://stackoverflow.com/questions/17478731/whats-the-point-of-x-requested-with-header

http://www.slideshare.net/myfear/security-in-practice-with-java-ee-6-and-glassfish
 и прочее



Comments