Имеет ли Java переполнение буфера?
имеет ли Java переполнение буфера? Если да, можете ли вы дать мне сценарии?
5 ответов
поскольку строки Java основаны на массивах char, а Java автоматически проверяет границы массива, переполнение буфера возможно только в необычных сценариях:
- Если вы вызываете родной код через JNI
- в самой JVM (обычно написанной на C++)
- интерпретатор или JIT-компилятор работает неправильно (Java bytecode обязательные проверки границ)
управляемые языки, такие как Java и C#, не имеют этих проблем, но определенные виртуальные машины (JVM/CLR/etc), которые фактически запускают код, могут.
для всех намерений и целей, нет.
Java имеет значения!--4-->проверка границ чтобы проверить, что данные не могут быть доступны из области вне выделенного массива. Когда один пытается получить доступ к области, которая находится за пределами размера массива,ArrayOutOfBounds
исключение.
Если есть переполнение буфера, это, вероятно, от ошибки в виртуальной машине Java и, насколько мне известно, не предполагаемое поведение, написанное в Спецификации языка Java и спецификации виртуальной машины Java.
да и нет. Нет, в этом вы не можете создать ошибочно открыть себя для уязвимости переполнения буфера, потому что это модель управляемой памяти. Однако в JVM и JDK могут быть уязвимости переполнения буфера. См. Этот совет Secunia:
переполнение буфера в строгом смысле перезаписи стека или самой кучи потребует либо:
- ошибка в рамках (они существовали в прошлом и, возможно, снова)
- использование JNI (по существу, больше не использует управляемый код)
переполнение буфера в том смысле, что у вас есть код, использующий буфер, и ваш код отвечает за его правильный анализ, но не может этого сделать. Например, можно написать XML парсер и кто-то может предоставить вам неправильный (или законный, но необычный) запрос, который из-за конструкции вашего парсера перезаписывает ранее проверенные данные с некоторой полезной нагрузкой, которая заставит ваше приложение вести себя плохо.
эта последняя форма менее вероятна, но плохо написанная функция очистки строк sql широко распространена, у которой была проблема