タイトル/名前 | 更新者 | 更新日 |
---|---|---|
技術/Security/DOM based XSS メモ1(DOMinator) | msakamoto-sf | 2015-03-07 21:46:56 |
技術/HTTP/Fenix Web Server (静的ページ開発用ローカルWebサーバ) | msakamoto-sf | 2015-03-07 20:20:26 |
Java/WebSocket/勉強メモ1 | msakamoto-sf | 2015-03-07 20:14:03 |
Java/ExecutorService, Futureのサンプル | msakamoto-sf | 2015-03-03 01:05:08 |
Java/Unicodeの正規化(normalize)メモ1 | msakamoto-sf | 2015-03-01 22:24:44 |
Java/ホスト名, マシン名を取得するメモ | msakamoto-sf | 2015-03-01 00:38:59 |
Java/JavaServer Faces(JSF)/調査メモ1 | msakamoto-sf | 2015-03-01 00:08:52 |
Java/NetworkInterfaceとMACアドレスの取得 | msakamoto-sf | 2015-02-22 22:18:21 |
Java/JavaDB, Apache Derbyの練習とメモ | msakamoto-sf | 2015-02-21 20:52:45 |
Java/Classのキャスト, instanceof演算子の代替など | msakamoto-sf | 2015-02-21 19:42:04 |
先日外部のWebセキュリティの方と話していたら、DOM based XSSの話題でDOMinatorというのを教えてもらいました。メモとして参考リンクなど残しておきます。
初期:Google Codeでホスティングされてた時代:
→2011年の紹介Blog:
→現在はMinded Security社の製品として、Webセキュリティの検査員向けのツール製品として販売。Free Trialは日数限定・機能限定のお試し版。
→上記HPのヘッダにリンクがあった、DOM based XSSのテストケースについてのナレッジベースWikiらしい:
Minded Security社作成の、DOM based XSSのテストサイト:
こちらは恐らくProになる前のGoogle Code時代のをGitHubに移してきたと思われる。コミットログもFirefox8時代の対応で止まっている。
アプローチとしては、FirefoxのJSエンジンを直接改造して、入力から出力に至るまでのコードパスを解析できるようになっている。
恐らく静的解析と、実行時の挙動を捉える動的解析を組み合わせた形と想像される。
結構便利だったのでメモ。
開発用にローカルでシンプルなWebサーバを立てられる。
node.jsでのサーバが内部では起動される。
便利なのが、公開するディレクトリとポート番号のペアを複数設定できる=Webサーバのインスタンスを複数起動出来る点。
動的なFWというわけでは無いため、静的なリソースに限定されるものの、HTMLとかJavaScriptのちょっとした実験にも便利。
一度インストールすればOKではあるが、いざインストールしようとすると中々名前を思い出せなかったりするのでメモ。
JavaでWebSocket使うときどうするか、の勉強メモ。
Java API for WebSocket(JSR 356)がJavaEE7以降扱えるようになったっぽい。
参考:
Stack Overflowでの参考資料とか載ってるやりとり:
github上の練習コード:
行儀の良いスレッドプールのシャットダウン:
たまたま、はてブで、以下の記事を発見。「は~、Unicodeって色んな記号あるんだな~」と眺めてた。
そしたら、同じblogでこんな記事を見つけた。
記事はPHPだったが、Javaだとうどうかな?と思ってぐぐったらこんなの見つけた。
JDK6から正規化が使えるようになったみたい。
このへんで、ちゃんと「Unicode 正規化」でぐぐったら以下の記事を発見。スゴイ。
Javaの正規化で、本当に上の記事のようになるか、確認してみた練習:
https://github.com/msakamoto-sf/javasnack/commit/5853d88d0e043e85decf37272e07b1e5ce076ac1
実は以前調べたことがあり、間違って System.getenv("HOSTNAME") を使ってしまった。
Facebookで他のエンジニアがLinux前提で /proc/sys/kernel/hostname を読み込む方法使ってたのを見かけ、HOSTNAMEを使う方法を教えたらうまく動かず、今回改めて調べ直したら見事にHOSTNAME使うのはbash依存ということが判明orz.
"InetAddress.getLocalHost().getHostName()"はマシンのネットワーク設定, DNS等によっては失敗したり、期待したものとは異なるものが返ってくる可能性がある。
System.getenv("HOSTNAME") はNGだった。というのは、"HOSTNAME"は厳密にはbashが設定する「変数」であり、「環境変数」ではない。そのため、bash系の設定ファイルによっては、HOSTNAMEが環境変数としてexportされずに、取得できないケースがある。
参考:
unixであれば Runtime.getRuntime().exec("hostname") が無難。これはネットワーク設定ではなくkernelレベルで設定されたマシン名を返す。
Linuxの場合なら、 /proc/sys/kernel/hostname をJavaで直接読み込んでも良い。hostnameコマンドも結局このファイルを読み書きしてるだけ。
参考:
Windowsの場合は、System.getenv("COMPUTERNAME") が使えるらしいが、厳密な調査は出来てない。
JSFとはどんなものか、いくつかググってみた参考URLメモ。
JavaEEに含まれるHTMLなどの画面系の仕様であり、JSRで調整されている。
また数年ごとにバージョンアップされており、開発のしやすさや機能性は向上している。
JSF 1.x系の時の評判は、一旦忘れて、素直にJSF 2.x系の最新版を調べたほうが良さそう。
JSPとは別物と考え、特にJSF 2.2で入ってきたらしいFaces Flowについては画面遷移の制御で、むしろSpring WebFlowやASP.NETアプリに近いアーキテクチャになってる・・・ような、印象を受けた。
JSF 2.xや2.2系列について、HTML5との親和性が向上した云々:
JSFでのリッチなUIライブラリとして、PrimeFacesというのがある。HTML5にも対応しているらしい。
他にもJBossのRichFacesがあった。
ただ、フロント開発がJavaScriptともに大きく揺れ動いている昨今、HTML5との兼ね合いや、訴求対象の開発者のカテゴリなどで、色々将来どうなの?的な話も見つかる。
例えば以下の記事は、JSFで実際に開発してみて、もう沢山だ!となった人が色々と愚痴をまとめてる。コメント欄も炎上してて、JavaEEのMVC仕様策定者もコメントしてたりで、大変面白いことになってる。
実際にJSFの内部のライフサイクルや、どうデバッグするかの解説記事。これを見るとASP.NETと似通った部分があり、サーバサイドとフロントのJavaScriptサイドの両方の知識が要求されることが分かる。
余談だが、JAX-RSやSpring MVCのちゃんぽん的に、JavaEEでMVC(つまりURLマッピングに基づくアクションコントローラ形式)のフレームワークの仕様化が始まっている。
個人的には、JSFにせよMVCにせよ、どんどん複雑・多様化していくWebフロントエンド技術で、どうしても発生する「複雑さ」をどこに持っていくかの問題になってきてる気がする。
AngularJSなどの最近のWebフロント技術は、基本的にブラウザ側のHTML+JSで複雑さに対応し、サーバサイドはAPIだけに絞る方向に見える。
一方でJSFやASP.NETの世界は、複雑さをサーバサイドの状態管理で対応しようとしていて、そのため、サーバサイドのライフサイクルとフロントエンド側のJSの両方に、微妙に複雑さがまたがってしまってる感じを受ける。
また業務アプリとそれ以外でも断絶はある。消費者向けのコンテンツサイトにおいて、業務アプリのような複雑なUIや画面遷移は必要ない。むしろREST的な世界観を求められるため、状態に紐付いたURLは敬遠される。一方で業務アプリはURLのREST性は不要なので、サーバサイドで状態管理された、非RESTなURLや画面遷移は許容される。また大規模開発をサポートするために、コンポーネント指向の仕様やフレームワークになっていく。
個人的には、もはやWebフロントの複雑性はサーバサイドで状態管理できる範囲を超えていて、JSFや.NET系のサーバサイド+フロントJSで状態管理を連携させるアーキテクチャは、開発者の負担が上がっているのではないかと思う。
むしろサーバサイドはAPIと初期HTMLページを表示するだけのものと割り切り、JS側でDOM構造の状態管理を行う方が、境界が明確で分かりやすい。(学習曲線はこの際無視する)
その上で、消費者向けのコンテンツサイトなどと、業務アプリでの複雑なUIコンポーネント制御とで、使用されるJSライブラリは異なってくるだろう。
・・・とはいっても、JSFはコンポーネント指向+画面フローの制御という点に旨味があるのは確かなで、一緒についてくる「苦味」とどこまで・どの位付き合っていけるかはもう少し勉強してみないと分からなそうであります。
Java 1.6 になり、java.net.NetworkInterfaceクラスでMACアドレスを取得できるメソッドが追加された。
練習:(ほぼITProからのコピペ)
参考:
練習:
Classのキャストなどで便利そうな Class のインスタンスメソッド3選。
someMethod(Class superClazz, Object testee) { if (testee instanceof superClazz) {
というのはsyntax errorで書けないが、
someMethod(Class superClazz, Object testee) { if (superClazz.isAssignableFrom(testee.getClass()) {
と書くことができるようになる。
someMethod(Class castClazz, Object target) { Object o = (castClazz) target;
というのはsyntax errorで書けないが、
someMethod(Class castClazz, Object target) { Object o = castClazz.cast(target);
と書くことができるようになる。
最後のがユースケース不明でちょっと使い道が分からなかったけど、とりあえず3種類、テストケースで使い方を練習してみました: