mod_mruby でインプットフィルター!

mruby という組み込み向けの ruby があります。mruby で apache モジュールを書いちゃうおうよ、というのが mod_mruby です。

ということで、POST なリクエストのヘッダとボディをファイルに書き出すインプットフィルターを書いてみました。

# Log headers and a body of POST requests.
# You have to install mod_mruby first.
#
# Add a following line to httpd.conf:
#   mrubyInsertFilterFirst /var/www/request_dumper.rb

LOG_FILE = "/tmp/request.txt"
MAX_LEN = 1024
IN_ONE_LINE = false

M_POST = 2

def format_time(time)
  sprintf("%04d-%02d-%02d %02d:%02d:%02d",
          time.year, time.month, time.day,
          time.hour, time.min, time.sec
         )
end

r = Apache::Request.new

if r.method_number == M_POST
  File.open(LOG_FILE, "a") do |fh|
    body = r.body.to_s[0...MAX_LEN]
    if r.headers_in["Content-Type"].to_s[0,9] == "multipart"
      body = body.inspect
    end
    headers_str = r.headers_in.all.map{|k, v| "#{k}: #{v}"}.join("\n")
    record = ["[#{format_time(Time.now)}]",
      "#{r.the_request}\n#{headers_str}", "#{body}"]
    if IN_ONE_LINE
      record[1] = record[1].inspect
      fh.write(record.join(' ') + "\n")
    else
      fh.write('='*80 + "\n" + record.join("\n\n") + "\n")
    end
  end
end

こんな感じでログが書き込まれます:

================================================================================
[2014-04-04 15:18:33]

POST /post HTTP/1.1
Host: 192.168.3.32
Accept-Language: ja,en-us;q=0.7,en;q=0.3
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:28.0) Gecko/20100101 Firefox/28.0
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 68
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Referer: http://192.168.3.32/post
Accept-Encoding: gzip, deflate

text=%E3%83%86%E3%82%B9%E3%83%88%E3%81%A7%E3%81%99%E3%82%88%EF%BC%81
================================================================================
[2014-04-04 15:19:17]

POST /post HTTP/1.1
Host: 192.168.3.32
Accept-Language: ja,en-us;q=0.7,en;q=0.3
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:28.0) Gecko/20100101 Firefox/28.0
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------150323039317955918432071897657
Content-Length: 2008267
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Referer: http://192.168.3.32/post
Accept-Encoding: gzip, deflate

"-----------------------------150323039317955918432071897657\r\nContent-Disposition: form-data; name=\"file\"; filename=\"HigherOrderPerl.pdf\"\r\nContent-Type: application/pdf\r\n\r\n%PDF-1.6\r%\342\343\317\323\r\n1914 0 obj\r<</Linearized 1/L 2008022/O 1916/E 113329/N 592/T 1969698/H [ 696 7017]>>\rendobj\r       \rxref\r1914 20\r0000000016 00000 n\r\n0000007713 00000 n\r\n0000007802 00000 n\r\n0000008060 00000 n\r\n0000008186 00000 n\r\n0000009369 00000 n\r\n0000010546 00000 n\r\n0000011730 00000 n\r\n0000011809 00000 n\r\n0000012020 00000 n\r\n0000012232 00000 n\r\n0000013892 00000 n\r\n0000015068 00000 n\r\n0000015277 00000 n\r\n0000015450 00000 n\r\n0000039530 00000 n\r\n0000063166 00000 n\r\n0000087969 00000 n\r\n0000113108 00000 n\r\n0000000696 00000 n\r\ntrailer\r<</Size 1934/Prev 1969687/Root 1915 0 R/Info 1913 0 R/ID[<CF4992AF0C9F828AE8D069D397CF7C52><D0928505241A4E14B4780974C7AF4F2E>]>>\rstartxref\r0\r%%EOF\r           \r1933 0 obj\r<</Length 6921/Filter/FlateDecode/I 19519/L 19503/S 19330>>stream\r\nx\332\354\\{\\23g\272\236\311\21520!22\b3020,\204\213\301Z\eM\264\251\2056@\300\304[0322D27\334x)\v\326v\241\202k\267\356i02B\34335\251(Z\365\204E\252\326j\265\325\266k\273\27706\260T"

簡単に書けちゃいました。同等の apache モジュールを書くのは大変ですよ!Web アプリケーションのデバッグとか、セキュリティチェックとかで使えそうですね、mod_mruby ちゃん!

(コウヅ)

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中