ポートを使用しているプロセスを調べる

lsofを使う

$ lsof -i:22

COMMAND   PID   USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
httpd     503 apache    4u  IPv6 147871264      0t0  TCP *:http (LISTEN)
httpd    2552 apache    4u  IPv6 147871264      0t0  TCP *:http (LISTEN)
...

プロセスIDを指定するとプロセスが使用しているファイルが参照できる

$ lsof -p 503

COMMAND PID   USER   FD   TYPE    DEVICE SIZE/OFF      NODE NAME
httpd   503 apache  cwd    DIR     202,1     4096         2 /
httpd   503 apache  rtd    DIR     202,1     4096         2 /
httpd   503 apache  txt    REG     202,1   528608    410347 /usr/sbin/httpd
httpd   503 apache  DEL    REG       0,5          184309674 /dev/zero
httpd   503 apache  mem    REG     202,1   275920    691626 /usr/lib64/php/5.6/modules/redis.so
...

multipart/form-data時の生POSTデータを見る

php://input は、 enctype="multipart/form-data" に対しては使用できません。とのこと。
どうやら、Content-type: multipart/form-data の時のみ機能しないみたい。
とのことなので、.htaccessでmultipart/form-dataのヘッダーをunsetすればよい

.htaccess

SetEnvIf content-type (multipart/form-data)(.*) MULTIPART_FORMDATA=true
RequestHeader unset content-type env=MULTIPART_FORMDATA
<?php
var_dump(file_get_contents("php://input"));

今日のハマりどころ

まだまだ、SNIに対応してないクライアントは沢山ある

サーバのSSL証明書を更新したらある程度古いAndroid端末からSSL通信できないという事象が発生。
ジオトラストの証明書にしたんで、きっと中間証明書かクロスルート証明書絡みなんだろうな〜と思いながら調査をしていたが、

$ openssl s_client -showcerts -connect www.mydomain.jp:443

の値も更新前の証明書の値が返ってきたりで...

ん?virtual host??
www

対象のAndroid端末はすべてDefaultHttpClientからリクエス
以下の記事にあるように「HttpURLConnectionではSNI接続を試みる」とあるようにDefaultHttpClientではSNIに対応してないように読み取れる
http://android-developers.blogspot.jp/2011/09/androids-http-clients.html

で、対象のサーバの設定を確認してみたところ、が思いっきり、更新前の証明書を参照しているではありませんかwww
SNIに対応してないクライアントへはdefault virtual hostの期限切れ証明書を返していただけというオチ。

で特に複数証明書を運用するサーバでもなかったので、default virtual hostを停止したんだけど...






真剣にSNI運用しているサーバって非対応クライアントからのアクセスどうしるんだろう...

svn resolvオプションメモ

tree衝突した時のオプションをよく忘れるので。

$ svn resolve --accept working filename

base
 作業コピーを更新する前の、BASE リビジョンのファイルを選択します。これは、最後の編集を行う前のチェックアウトしたファイルです。
working
 手動で競合解決を行ったと仮定し、現在作業コピーにあるファイルを、このファイルのバージョンとして選択します。
mine-full
 競合したすべてのファイルを、svn update を実行する直前にあったファイルのコピーで、解決します。
theirs-full
 競合したすべてのファイルを、svn update を実行したときにサーバから取得したファイルのコピーで、解決します。

あとは、ディレクトリ全体のsvn revert
$ svn revert --recursive .

HostヘッダーなしでプライベートIPがLocationヘッダーに出力される件

http://www.intellilink.co.jp/article/column/security-net02.html

通常、下のようなURLにアクセスし、
http://example.com/img
サーバ内のDocumentRootにimgというファイルが存在しない場合、

Location:http://example.com/img/

のヘッダーが吐き出され、http://example.com/img/ にリダイレクトする

ある特定の条件下で、

Location:http://192.168.0.1/img/

のようにプライベートIP漏洩するケースがある

条件は

  • HTTP/1.0
  • クライアントからHostヘッダーの送信なし (HTTP/1/1は必須)
  • apacheの場合、httpd.confのServerNameディレクティブが未定義 vhostsのServerNameは関係しない

理屈としては、LocationヘッダーによるリダイレクトはHostヘッダーを見て定義する、存在しない場合はServerNameディレクティブの値とするということらしい。

解決はhttpd.confのServerNameディレクティブを設定することで対応できる (vhostsは不可)