タイトル/名前 | 更新者 | 更新日 |
---|---|---|
JavaScript/各種DOM操作におけるHTMLタグのエスケープメモ | msakamoto-sf | 2011-06-26 13:17:51 |
JavaScript/DOM based XSS | msakamoto-sf | 2011-06-26 13:13:30 |
日記/2011/06/26/jQueryとXSSの勉強(1) | msakamoto-sf | 2011-06-26 12:14:47 |
日記/2011/06/25/御茶ノ水駅にて。 | msakamoto-sf | 2011-06-25 19:08:14 |
技術/Android/HTTP通信でCookieを取り扱うには | msakamoto-sf | 2011-06-19 16:25:34 |
技術/Apache/mod_rewriteメモ(2):FollowSymLinks必須(となる場合がある) | msakamoto-sf | 2011-06-18 11:02:48 |
技術/Apache/WindowsバイナリでHTTPS | msakamoto-sf | 2011-06-11 22:53:58 |
技術/Android/SecureDevelopment | msakamoto-sf | 2011-06-11 16:31:24 |
技術/Windows/共有フォルダにアクセスしているのに認証ダイアログが表示されない | msakamoto-sf | 2011-06-11 16:07:57 |
PHP/PECL OAuth/HTTP Proxyを使う | msakamoto-sf | 2011-06-11 15:57:41 |
日記/2011/06/26/jQueryとXSSの勉強(1)関連メモ。
JavaScriptのDOM操作で文字列をDOM要素として出力する方法について、HTMLタグをエスケープしてくれるか調べてみた。
HTMLタグが混ざっている文字列をDOMのText要素として出力するということは、それ自体が違和感がある。
HTMLタグを使っているのならば、それぞれのタグに応じた要素を一つずつ組み立てる必要があるのでは?
そうではなく、あくまでも「文字列」としてHTMLタグを出力したい時、どうなるか、という実験。
結果:
検証環境:
OS : Win7Pro SP1 32bit 日本語版 ブラウザ: Firefox 5.0 Chrome 12.0.742.100 IE 9.0.1
検証コード:
<html> <head> <title>jQuery XSS Test</title> <script type="text/javascript" src="./jquery-1.6.1.min.js"></script> </head> <body> <script type="text/javascript"> function add_html_danger(msg) { var p1 = document.getElementById("p1"); p1.innerHTML = msg; } function add_html_safe1(msg) { var p2 = document.getElementById("p2"); p2.firstChild.nodeValue = msg; } function add_html_safe2(msg) { var p2 = document.getElementById("p2"); var t = document.createTextNode(msg); var c = p2.firstChild; p2.replaceChild(t, c); } function add_html_safe3(msg) { $("#p2").text(msg); } </script> <input type="button" value="innerHTML : danger" onClick="add_html_danger('<b>hello</b>');" /><br /> <input type="button" value="nodeValue : safe" onClick="add_html_safe1('<b>hello</b>');" /><br /> <input type="button" value="createTextNode and replaceChild : safe" onClick="add_html_safe2('<b>hello2</b>');" /><br /> <input type="button" value="jQuery.text() : safe" onClick="add_html_safe3('<b>hello3</b>');" /><br /> <hr /> result:<br /> <p id="p1">foobar</p> <p id="p2">barbaz</p> <hr /> <a href="#foo<b>bar</b>">hash!</a><br /> <hr /> after "hash!" link click:<br /> <input type="button" value="innerHTML : danger" onClick="add_html_danger(location.hash);" /><br /> </body> </html>
innerTextは未検証。
JavaScript/各種DOM操作におけるHTMLタグのエスケープメモを書いたそもそものきっかけが "DOM based XSS" ということで、リンクメモ。
url?name=<b>foo</b>
が太字表示 → 要チェック
url#name=<b>foo</b>
が太字表示 → 要チェック+サーバへのリクエストに"#"以降は含まれない!
url?link_href=javascript:alert()
どこかのリンク要素にそのまま出力 → 危険
実験してみた:
<html> <head> <title>jQuery XSS Test</title> <script type="text/javascript" src="./jquery-1.6.1.min.js"></script> </head> <body> <script type="text/javascript"> function add_html(msg) { $(msg).appendTo("body"); } </script> <input type="button" value="test1" onClick="add_html('<b>hello</b>');" /><br /> <a href="#foo<b>bar</b>">hash1</a><br /> <hr /> after "hash1" link click:<br /> <input type="button" value="test2" onClick="add_html(location.hash);" /><br /> <input type="button" value="test3" onClick="add_html(location.hash.substring(1));" /><br /> </body> </html>
oops!
昨日の夜、会社から帰るとき、御茶ノ水駅で中央線豊田行の電車を見かけた。
御茶ノ水近くの某Webベンチャーでアルバイトをしていたのは2007-2008年にかけて。
あの頃は、毎日あの電車に乗って豊田まで帰っていた。
あれから4年近く経ち、今は反対側のホームで千葉/津田沼行の電車を待っている。
面白いなぁ。
2011年6月現在、AndroidでHTTP通信でよく使われるコンポーネントは次の三種類。
WebViewコンポーネントはCookieを自動的に処理してくれる。SQLite3のデータベースに、認証情報やForm入力値などと共に保存され永続化される。
本記事では残りの java.net, HttpClient でのCookieの取り扱いについて簡単にメモする。
JDKのCookie機能と同じ。CookieHandlerをベースとして、API Level 9以上であればデフォルト実装としてCookieManagerを利用出来る。
CookieHandler : JDK 1.5 以上, Android 1.0 (API Level 1) 以上 CookieManager : JDK 1.6 以上, Android 2.3 (API Level 9) 以上
CookieManagerではsecure属性もきちんと区別してくれる。
CookieHandlerについては上手くサンプルを動かせなかったため、secure属性の区別は未検証。
参考:
Apache HttpClientのTutorialドキュメント参照。
Androidに含まれているHttpClientのバージョンは 4.0.beta前後らしい。
プラットフォームの互換性維持のため、Apache側とはアップデートを同期出来ていない模様。
実際、 現在ログイン中のユーザーは、指定されたデータ(ID=981)にアクセスする権限がありません。 でも紹介しているようにApache側とインターフェイスにズレが生じている。
個人的なオススメ:
HttpClientの方がHTTPを強く意識しているので、エンコード・デコード系のメソッドも充実しているしHTTPに素直に触れるような構成になっている。API呼び出しのように自分でパラメータを組み立てたり、HTTPヘッダーを細かく操作する場合はHttpClientをお薦めしたい。
逆にHttp(s)URLConnectionをお薦め出来る場面は、静的リソースを単純にGETするだけで 4xxや5xx系をまとめてエラーとして扱って良い場合に限定させてもらう。
とはいえ、これは個人的にHttp(s)URLConnectionに対して「良い思い出」が無いせいでもある。
今現在Http(s)URLConnectionでも用が足りているのであれば、強いてHttpClientに乗り換える理由は無い。
久しぶりにhttpd.confとかmod_rewrite触っていたら思いっきりハマってしまったのでメモ。
mod_rewriteはFollowSymLinks必須。ただし、ディレクトリごとに有効・無効を切り替えたい場合。
下記の、比較的信頼性が高いと思われるドキュメントですら、これについてはわずか1-2行、しかもドキュメントの冒頭ではなく、中途半端に最後のほうであったり真ん中辺りなので、読み落とす可能性は高い。
ApacheHTTPDの公式ドキュメントでも最後の方に "Note: Enabling rewrites in per-directory context" として、太字ではあるが、さりげなく書いてあるだけ。もっと最初の方に書いておいて欲しいよなぁ・・・。
WindowsバイナリでHTTPSを設定するメモ。
検証環境:
Windows 7 Professional SP1 32bit 日本語版 Apache/2.0.64 + mod_ssl, openssl
元ネタ:
1.OpenSSLに対応したWindows用のApache HTTPDサーバーのバイナリを入手。
最近ではApache HTTPDの本家サイトからmod_ssl + openssl 付きのWin32バイナリを入手できますので、それを使う。
あとは適宜インストールする。
2.証明書作成
詳しい解説は上記元ネタ、或いは適宜Webで検索。
openssl.exe : (Apache)\bin\openssl.exe openssl.cnf : (Apache)\conf\openssl.cnf
Vista, Win7での注意点:以下のコマンドライン操作は、管理者として実行したコマンドプロンプト上で行う。
> cd ...(Apache) > bin\openssl req -config conf\openssl.cnf -new -out localhost.csr ... > bin\openssl rsa -in privkey.pem -out localhost.key ... > bin\openssl x509 -in localhost.csr -out localhost.crt -req -signkey localhost.key -days 3650
以下のファイルが生成されているので、"conf\ssl" フォルダなどにまとめておく。
privkey.pem localhost.csr localhost.crt localhost.key
もしVista, Win7上で「管理者として実行」ではない通常のコマンドプロンプト上で操作した場合は、次のフォルダ以下に生成される。
C:\Users\(ユーザー名)\AppData\Local\VirtualStore\Program Files\...
適宜削除してやり直すなり、そのまま本来のフォルダに移すなりする。
3.Apacheの設定
mod_ssl.soをLoadModuleする。
LoadModule ssl_module modules/mod_ssl.so
SSLCertificateFileとSSLCertificateKeyFileに適宜設定する。
SSLCertificateFile conf/ssl/localhost.crt SSLCertificateKeyFile conf/ssl/localhost.key
あとは適当にhttpd.confやコマンドラインオプションを調整して動くようにすればOK。
"<IfDefine SSL>"とかでssl.confをまるごと囲ってる場合などは "-D SSL" をコマンドラインに混ぜておく。"<IfDefine SSL>"を外してしまえば "-D SSL" は不要。
Apacheも2.0と2.2系列とでは設定ファイルの構成が変わってきているので、その辺りの匙加減は適宜調整。
Androidのセキュリティ機能や、安全なスマートフォンアプリ開発のための参考リンク集。
iSEC提供の解析系Androidアプリ:API Level 1前提のソースのzipで公開されているので、利用するにはAndroid SDKを導入してビルドする必要がある。
こんなのもあった。
認証が必要な共有フォルダにアクセスしても、認証ダイアログが表示されず、アクセスエラーになってしまう場合についてメモ。
Windowsの認証の仕組みは大分忘れてしまっているので、かなり曖昧に書いてますが、とにかく上記のケースについて。
共有フォルダはWindows Serverでバージョンは2003だか2008だか、とりあえず新しめ。
そのファイルサーバーではドメインコントローラも動いてる?らしい。
他のWinXPでアクセスしたときは認証ダイアログが表示あれ、ドメイン名\ユーザー名 形式でアクセスできた。
ただしドメインには参加せず、みんなWORKGROUPワークグループで使ってる。
各PCのローカルアカウントは、ドメインのアカウントとは別にみんな好き勝手なユーザー名で設定してる。
で、Win7/64bitおよびXPModeから共有フォルダにアクセスしても認証ダイアログが表示されない。
原因がよく分からないのでとりあえず解決した手段をメモ。これが本来的に正しい解法なのかも不明。
他:
PECL OAuth:
Windowsバイナリ:
PECL OAuthはcURLを使ってHTTP通信を行う。
そのため HTTP Proxy の設定もcURLのレイヤーが対象となる。
方法1:Cのソースを直接書き換え、cURLのProxy設定処理を追加する。
参考:
方法2:環境変数でcURLにHTTP Proxyを伝える。
参考:
どちらの方法を採るかはいつものようにケース・バイ・ケースで。