みなさん、エイプリルフールはいかがでしたか?
ネットでの1年に一度のお祭りですからね。楽しまない手はありません。
当blogでは3本のエイプリルフールネタを用意しました。
わんくま同盟ではエイプリルフールネタは先頭に*をつけるようになっています。
そのほかのエイプリルフールネタは
こちらをどうぞ。
種明かし
*で隠されたパスワードがJavaScriptによって抜取られる
これはJavaScriptを用いたセキュリティホールっぽいネタでした。
参照している元ネタ記事は本物で、JavaScriptを使うことでpasswordフィールドの値を
参照できてしまいます。のんきに「便利~」とか言っているのはいかがかと思うのですが…。
サンプルコードのHTMLを実際に試すと分かるのですが、
iFrameの外からもpasswordフィールドを参照できます。これも本当。
では、他のページをFrame内に表示させてpasswordフィールドを参照できるかというとできない。
これは、JavaScriptのサンドボックスによって阻まれます。
ドメインが違った場合は参照できないようになっているんですね。
ただし、アドレスバーでのJavaScriptは該当ドメインでのスクリプトとみなされるので
アドレスバーのスクリプトであればどこのページでも読み込むことができます。
* Microsoft J#に代わる新しいJava互換言語
こちらは純粋に嘘記事ですね。
script APIによるサンプルは本物で、実際のコードもそのようになります。
ただし、拡張子csに対するスクリプトエンジンは現時点では存在しないでしょうから
実際には実行時エラーになることでしょう。
もし、拡張子csに対するスクリプトエンジンの実装があれば、本当に動くコードです。
*演算子を用いてJavaでポインタを扱う
JavaでC言語的なポインタは当然扱えないわけですが、
提示のサンプルプログラムは本当に動くので性質が悪い。
ソースをコピー&ペーストしてEclipseに乗っけて見た人は、
本当にコンパイルエラーが出ず、本当に実行すると8という計算結果がコンソールに出力され驚いたかもしれません。
public class Test {
public static void main(String[] args) {
int i = 5;
// #start unsafe# http://java.sun.com\u000a\u002f\u002a
int *ip = &i;
// ポインタの内容に3を加算
*ip += 3;
// 演算結果をiに代入
i = *ip;
// #end unsafe# http://java.sun.com\u002a\u002fi+=\u0033\u003b
System.out.println(i);
}
}
これは、Javaのソースで\uXXXXという形式でUnicodeによる文字エスケープする機能を利用しています。
サンプルコードにある\uXXXXを該当の文字に変更すると
public class Test {
public static void main(String[] args) {
int i = 5;
// #start unsafe# http://java.sun.com
/*
int *ip = &i;
// ポインタの内容に3を加算
*ip += 3;
// 演算結果をiに代入
i = *ip;
// #end unsafe# http://java.sun.com*/i+=3;
System.out.println(i);
}
}
というコードになります。このエスケープが入ってからコンパイルが行われるわけです。
\u000aがポイントで、改行コードですね。
これにより//コメントの後ろで改行を行って、コメントではなくして処理を書いているというカラクリ。
Eclipseのエディタは行単位で構文解析しているっぽく、この改行コードを検出できないようです。
そのため、エディタ上のハイライトではコメントの色に変ってくれない。
そういうわけで、なまじJavaがわかって、本当にエディタにコピーしてみた人ほど首を傾げることになります。
投稿日時 : 2008年4月2日 13:05