Как предотвратить Dos-атаку для метода BufferedReader readLine () в Java? - PullRequest
3 голосов
/ 18 июня 2011

У меня есть ситуация, когда я использую BufferedReader readLine() для чтения данных из сокета, но readline() читает данные, пока не найдет символ новой строки / возврат каретки в данных.
И если мои данные не содержат символ новой строки, они будут продолжать читать данные, пока не найдут новую строку, и злоумышленник не сможет внедрить DOS-атаку. И даже сокет может тайм-аут.

Я знаю, что одним из решений может быть ограничение размера строки, чтение только некоторых данных и добавление данных в буфер.

Это оптимальное решение или я могу сделать это как-нибудь по-другому?

Я могу переопределить BufferedReader и переопределить метод readLine (). Возможно ли это решение?

1 Ответ

0 голосов
/ 01 сентября 2014

Использование Socket.setSoTimeout(int)

Цитирование из Javadoc

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

Если время ожидания истекло, возникает исключение java.net.SocketTimeoutException, хотя Socket все еще действует. Эта опция должна быть включена до начала операции блокировки, чтобы иметь эффект. Тайм-аут должен быть> 0. Тайм-аут, равный нулю, интерпретируется как бесконечный тайм-аут.

Также обратите внимание, что из этой строки

Эта опция должна быть активирована до начала операции блокировки, чтобы иметь эффект.

Вы должны позвонить Socket.setSoTimeout(int) перед выполнением операции read.

...