バッファオーバーフロー
日本語 | 文字配列溢れ |
英語 | buffer overflow |
ふりがな | ばっふぁおーばーふろー |
フリガナ | バッファオーバーフロー |
文字列を格納する配列を越えたサイズの文字列を格納すること。
文字列を格納する配列を「バッファ」といい、そのサイズを越えた文字列を格納して「オーバーフロー」してしまうため「バッファオーバーフロー」と呼ばれる。
また、この原因となる「バッファオーバーラン」が同義語として使われることもある。
Javaでは、配列のサイズを越えたインデックスナンバーを使用するとArrayIndexOutOfBoundsException例外が投げられるため、配列に対してバッファオーバーフローを起こすことはできない。
また、Stringクラスは書き換えが不可能なため、Stringクラスに対してバッファオーバーフローを起こすことはできない。
さらに、StringBufferクラスは可変長なため、StringBufferクラスに対してバッファオーバーフロー起こすことはできない。
以上の理由から、Javaでは「Javaそのものの欠陥」でない限り、バッファオーバーフローを発生させることはできない。
そもそも、Javaではバッファオーバーフローを起こす意味がない。
WindowsにおけるExeのような「実行ファイル」の場合、バッファオーバーフローは致命的な問題となる。それは、アクセスできるメモリ上に、変数とプログラムが同一に格納されているためである。
そのため、バッファオーバーフローにより「配列のサイズを越えた文字列」を書き込むことで「プログラムを書き換える」ことが可能になり、任意のプログラムが実行できるからである。
また、こういった実行ファイルを作るC++言語等が「バッファオーバーフローを検出できない」ため、バッファオーバーフローを許すことになる。
だが、Javaは仮想マシンの場合、メモリ環境は完全な管理下に置かれており、このようなことは通常は発生しない。
文字列を格納する配列を「バッファ」といい、そのサイズを越えた文字列を格納して「オーバーフロー」してしまうため「バッファオーバーフロー」と呼ばれる。
また、この原因となる「バッファオーバーラン」が同義語として使われることもある。
Javaでは、配列のサイズを越えたインデックスナンバーを使用するとArrayIndexOutOfBoundsException例外が投げられるため、配列に対してバッファオーバーフローを起こすことはできない。
また、Stringクラスは書き換えが不可能なため、Stringクラスに対してバッファオーバーフローを起こすことはできない。
さらに、StringBufferクラスは可変長なため、StringBufferクラスに対してバッファオーバーフロー起こすことはできない。
以上の理由から、Javaでは「Javaそのものの欠陥」でない限り、バッファオーバーフローを発生させることはできない。
そもそも、Javaではバッファオーバーフローを起こす意味がない。
WindowsにおけるExeのような「実行ファイル」の場合、バッファオーバーフローは致命的な問題となる。それは、アクセスできるメモリ上に、変数とプログラムが同一に格納されているためである。
そのため、バッファオーバーフローにより「配列のサイズを越えた文字列」を書き込むことで「プログラムを書き換える」ことが可能になり、任意のプログラムが実行できるからである。
また、こういった実行ファイルを作るC++言語等が「バッファオーバーフローを検出できない」ため、バッファオーバーフローを許すことになる。
だが、Javaは仮想マシンの場合、メモリ環境は完全な管理下に置かれており、このようなことは通常は発生しない。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// たとえばchar型配列で4文字の場合。
char[] chars = new char[]{ 'あ', 'い', 'う', 'え' };
System.out.println( chars );
// このサイズを越えて文字列を書き込むことを
// 「バッファオーバーフロー」と言います。
try
{
chars[4] = 'お';
}
catch( ArrayIndexOutOfBoundsException e )
{
e.printStackTrace();
// java.lang.ArrayIndexOutOfBoundsException: 4
// at Sample.main(Sample.java:14)
}
// このように、Javaでは例外が発生します。
// また、String型は書き換え不可能ですし、
// StringBufferは可変長なので、これらも
// バッファオーバーフローは発生しません。
// そもそも、メモリ環境が実行環境と異なるので
// バッファオーバーフローを発生させる意味もありません。
}
}
public class Sample
{
public static void main( String[] args )
{
// たとえばchar型配列で4文字の場合。
char[] chars = new char[]{ 'あ', 'い', 'う', 'え' };
System.out.println( chars );
// このサイズを越えて文字列を書き込むことを
// 「バッファオーバーフロー」と言います。
try
{
chars[4] = 'お';
}
catch( ArrayIndexOutOfBoundsException e )
{
e.printStackTrace();
// java.lang.ArrayIndexOutOfBoundsException: 4
// at Sample.main(Sample.java:14)
}
// このように、Javaでは例外が発生します。
// また、String型は書き換え不可能ですし、
// StringBufferは可変長なので、これらも
// バッファオーバーフローは発生しません。
// そもそも、メモリ環境が実行環境と異なるので
// バッファオーバーフローを発生させる意味もありません。
}
}
// Sample.java public class Sample { public static void main( String[] args ) { // たとえばchar型配列で4文字の場合。 char[] chars = new char[]{ 'あ', 'い', 'う', 'え' }; System.out.println( chars ); // このサイズを越えて文字列を書き込むことを // 「バッファオーバーフロー」と言います。 try { chars[4] = 'お'; } catch( ArrayIndexOutOfBoundsException e ) { e.printStackTrace(); // java.lang.ArrayIndexOutOfBoundsException: 4 // at Sample.main(Sample.java:14) } // このように、Javaでは例外が発生します。 // また、String型は書き換え不可能ですし、 // StringBufferは可変長なので、これらも // バッファオーバーフローは発生しません。 // そもそも、メモリ環境が実行環境と異なるので // バッファオーバーフローを発生させる意味もありません。 } }