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系のプロフェッショナルが詳しいんだろうなあ。とか。
 そんなわけで、たかがエスケープですが、奥が深うございました。
 奥深く考える機会をいただいた、よねけんさんに感謝したいと思います。
# しかし入り口のさわりで、まだまだ奥があるのでしょうが… --;
[VB.NET] 正規表現のエスケープ # String.Formatの危険性(改) その4 | オールトの雲
[...] つづく [...]
Link | 2012年10月22日 22:38