[java] Unicodeのエスケープ #String.Formatの危険性(改) その5

2010年7月1日

 String.Formatの危険性(改) その5です。「 [VB.NET] 正規表現のエスケープ 」からの続きです。
 今回が最終回です。

 前回を最終回にしようと思っていたのですが、「プログラマのための文字コード技術入門 (ISBN-13:978-4774141640)」を先日購入しまして、眺めていると興味深いことが書かれていたのでメモ。

 javaでは、unicodeのエスケープは文字列ではなく、まさに文字(?)らしく、ソースコードに対しても効いてくるらしいです。従って以下のコードはコンパイルできません。

java

public class Main {
    public static void main(String[] args) {
        System.out.println("aaaau000abbbb");
    }
}

 なんでかというと、コンパイラ(?)は上記のソースコードは以下のように見えるから。

java

public class Main {
    public static void main(String[] args) {
        System.out.println("aaaa      ←文字列の途中で改行されているように見える
bbbb");
    }
}

 ちなみにC#で、同様のコードを書いてみたところ、これはコンパイルエラーとなりませんでした。

C#

class Program
{
    static void Main(string[] args)
    {
        System. Console.WriteLine("aaaau000abbbb");
    }
}

 これを逆手にとって、javaでは以下のようなコードが書ける模様。

java

public class Main {
    public static void main(String[] args) {
        String u0061 = "aaaa";
        System.out.println(a);
    }
}

 …なんと面妖な。
 てことは、C#では同じ事は出来ないんだな?と思って実験。

C#

class Program
{
    static void Main(string[] args)
    {
        string u0061 = "aaaa";
        System.Console.WriteLine(a);
    }
}

 先生!コンパイルエラーになりません。出来る模様です…最早何がなんだか(笑
 このあたり、XSS系のプロフェッショナルが詳しいんだろうなあ。とか。

 そんなわけで、たかがエスケープですが、奥が深うございました。
 奥深く考える機会をいただいた、よねけんさんに感謝したいと思います。

 # しかし入り口のさわりで、まだまだ奥があるのでしょうが… --;






カテゴリー: C#, Java, Program, VB.NET

Follow comments via the RSS Feed | Leave a comment | Trackback URL

1 Comment to "[java] Unicodeのエスケープ #String.Formatの危険性(改) その5"

  1. [VB.NET] 正規表現のエスケープ # String.Formatの危険性(改) その4 | オールトの雲

    [...]  つづく [...]

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org