all your uri are belong to us
play

All Your URI are Belong to Us Geoffrey Young - PowerPoint PPT Presentation

All Your URI are Belong to Us Geoffrey Young geoff@modperlcookbook.org 1 http://www.modperlcookbook.org/~geoff/ Apache Request Cycle Client Request Logging URI-based Init Content URI Translation Fixups File-Based Init Resource Control


  1. All Your URI are Belong to Us Geoffrey Young geoff@modperlcookbook.org 1 http://www.modperlcookbook.org/~geoff/

  2. Apache Request Cycle Client Request Logging URI-based Init Content URI Translation Fixups File-Based Init Resource Control Mime Setting 2 http://www.modperlcookbook.org/~geoff/

  3. Apache Request Cycle Client Request Client Request URI-based Init URI-based Init URI Translation 3 http://www.modperlcookbook.org/~geoff/

  4. URI Translation • Apache needs to map the URI to a physical file on disk • Default is to prepend DocumentRoot to the URI DocumentRoot /usr/local/apache/htdocs 4 http://www.modperlcookbook.org/~geoff/

  5. URI Translation • Directives like Alias override the default DocumentRoot /usr/local/apache/htdocs Alias /manual/ /usr/local/apache/manual/ <Directory /usr/local/apache/manual> ... </Directory> • Some URIs have no associated file, but Apache tries anyway <Location server-status> ... </Location> 5 http://www.modperlcookbook.org/~geoff/

  6. PerlTransHandler Client Request Client Request URI-based Init URI-based Init PerlTransHandler 6 http://www.modperlcookbook.org/~geoff/

  7. PerlTransHandler • Useful for overriding the Apache default • Allows you to be extremely devious • There are a few pitfalls of which to be aware 7 http://www.modperlcookbook.org/~geoff/

  8. Simple PerlTransHandler • Be rid of those silly favicon.ico requests that end up 404 • Translate the incoming URI to a common place if it matches favicon.ico 8 http://www.modperlcookbook.org/~geoff/

  9. package Cookbook::Favicon; use Apache::Constants qw(DECLINED); use strict; sub handler { my $r = shift; $r->uri("/images/favicon.ico") if $r->uri =~ m!/favicon\.ico$!; return DECLINED; } 1; 9 http://www.modperlcookbook.org/~geoff/

  10. Client Request GET /foo/bar/baz/biff/favicon.ico HTTP/1.1 Host: www.example.com 10 http://www.modperlcookbook.org/~geoff/

  11. Client Request Client Request URI-based Init URI-based Init PerlTransHandler URI: /foo/bar/baz/biff/favicon.ico 11 http://www.modperlcookbook.org/~geoff/

  12. Client Request Client Request URI-based Init URI-based Init PerlTransHandler core translation FILE: /usr/local/apache/htdocs/images/favicon.ico 12 http://www.modperlcookbook.org/~geoff/

  13. Setup • add Favicon.pm to @INC ServerRoot /lib/perl/Cookbook/Favicon.pm • add to httpd.conf PerlModule Cookbook::Favicon PerlTransHandler Cookbook::Favicon • that's it! 13 http://www.modperlcookbook.org/~geoff/

  14. Winner Takes All • The first URI translation handler to return OK ends the phase –mod_perl or otherwise • Perl handlers usually return DECLINED –lets Apache's core translation engine do the filesystem mapping • Return OK only when you map the file to disk yourself 14 http://www.modperlcookbook.org/~geoff/

  15. Why Not Use mod_rewrite? • our Cookbook::Favicon is pretty much the same as RewriteRule /favicon.ico$ /images/favicon.ico • We did it in Perl • With Perl comes great power 15 http://www.modperlcookbook.org/~geoff/

  16. URI-based Sessions • A simple cookie-less session scheme stores the session in the URI • Storage can occur in the PATH_INFO http://manual/index.html/a92c5e • Or at the start of the URI http://a92c5e/manual/index.html • The second form has some distinct advantages 16 http://www.modperlcookbook.org/~geoff/

  17. package Cookbook::URISessionManager; use Apache::Constants qw(DECLINED OK); use Apache::URI; sub get_session { my $r = shift; my $uri = $r->parsed_uri; # Separate the MD5 session from the real path. my ($session, $path) = $uri->path =~ m!^/([a-fA-F0-9]{32})(/.*)!; return DECLINED unless $session; # Now, put the session in a note... $r->notes(SESSION => $session); # ... and set the URI to the proper path. $r->uri($path); return DECLINED; } 1; 17 http://www.modperlcookbook.org/~geoff/

  18. Advantages • Session parsing is done up front –everyone else gets the session from notes my $session = $r->notes('SESSION'); –even C handlers! –true even if you use PATH_INFO • Browsers take care of adding the session to relative links for you 18 http://www.modperlcookbook.org/~geoff/

  19. Disadvantages • The main problem with URI-based sessions is "session leakage" • Session data will show up in Referer logs whenever someone clicks offsite • A simple PerlTransHandler takes care of that 19 http://www.modperlcookbook.org/~geoff/

  20. package Cookbook::URISessionManager; sub get_session { ... } sub clean_uri { my $r = shift; my ($uri) = $r->uri =~ m!.*(http://.*)!; $r->send_http_header('text/html'); print<<EOF; <html> <head> <meta http-equiv="refresh" content="0;URL=$uri"> </head> <body> you should be going <a href="$uri">here</a> soon </body> </html> EOF return OK; } 1; 20 http://www.modperlcookbook.org/~geoff/

  21. httpd.conf PerlModule Cookbook::URISessionManager PerlTransHandler Cookbook::URISessionManager::get_session <Location /goodbye> SetHandler perl-script PerlHandler Cookbook::URISessionManager::clean_uri </Location> 21 http://www.modperlcookbook.org/~geoff/

  22. Mischievous Behavior • Simple URI re-mapping is only the beginning • Apache has this neat, built-in functionality called proxying –provided you have mod_proxy installed • With mod_perl and mod_proxy you can proxy just about anything... 22 http://www.modperlcookbook.org/~geoff/

  23. Advanced PerlTransHandler • Create a proxy that uses our local Apache documentation instead of ASF servers • Intercept proxy requests and silently replace calls to http://httpd.apache.org/docs with /usr/local/apache/htdocs/manual 23 http://www.modperlcookbook.org/~geoff/

  24. Client Setup 24 http://www.modperlcookbook.org/~geoff/

  25. Server Setup • Add this to httpd.conf PerlModule My::ManualProxy PerlTransHandler My::ManualProxy 25 http://www.modperlcookbook.org/~geoff/

  26. package My::ManualProxy; use Apache::Constants qw(OK DECLINED); use strict; sub handler { my $r = shift; return DECLINED unless $r->proxyreq; my (undef, $file) = $r->uri =~ m!^http://(www|httpd).apache.org/(.*)!; if ($file =~ m!^docs/!) { $file =~ s!^docs/!manual/!; $file = join "/", ($r->document_root, $file); if (-f $file) { $r->filename($file); # use local disk return OK; } } return DECLINED; } 1; 26 http://www.modperlcookbook.org/~geoff/

  27. Apache Request Cycle Client Request Logging URI-based Init Content URI Translation Fixups File-Based Init Resource Control Mime Setting 27 http://www.modperlcookbook.org/~geoff/

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend