<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>[blog.rayfoo] &#187; nginx</title>
	<atom:link href="http://blog.rayfoo.info/tag/nginx/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.rayfoo.info</link>
	<description>Infosec, DFIR, tech geekery, thoughts and whatnot</description>
	<lastBuildDate>Wed, 25 Jan 2012 00:36:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>DNS rebinding defense with Nginx</title>
		<link>http://blog.rayfoo.info/2010/02/dns-rebinding-defense-with-nginx</link>
		<comments>http://blog.rayfoo.info/2010/02/dns-rebinding-defense-with-nginx#comments</comments>
		<pubDate>Fri, 26 Feb 2010 16:47:58 +0000</pubDate>
		<dc:creator>ray</dc:creator>
				<category><![CDATA[Everything]]></category>
		<category><![CDATA[DNS rebinding]]></category>
		<category><![CDATA[hardening]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[server administration]]></category>
		<category><![CDATA[web server]]></category>

		<guid isPermaLink="false">http://blog.rayfoo.info/?p=461</guid>
		<description><![CDATA[DNS rebinding's a particularly nasty attack, having similar characteristics as CSRF attacks where the user's browser can be used to access/attack sites on behalf of the attacker. I'm not going to describe how it works here, there's plenty of literature out there that talks about it.  And if that's not enough, Google Is Your Friend. [...]]]></description>
			<content:encoded><![CDATA[<p>DNS rebinding's a particularly nasty attack, having similar characteristics as CSRF attacks where the user's browser can be used to access/attack sites on behalf of the attacker.</p>
<p>I'm not going to describe how it works here, there's <a href="http://en.wikipedia.org/wiki/DNS_rebinding">plenty</a> of <a href="http://ha.ckers.org/blog/20091201/dns-rebinding-video/">literature</a> out there that talks about it.  And if that's not enough, <a href="http://www.google.com/search?q=dns+rebinding">Google Is Your Friend</a>.</p>
<p>One of the simpler ways to defend against it is to have the server only serve requests with legit Host headers, which is what <a href="http://en.wikipedia.org/wiki/DNS_rebinding#Protection">Wikipedia says</a> anyway.  (No I didn't edit that portion myself)  This can be simply done with virtual hosts (HTTP/1.1), and can work for servers serving one domain, or two, or three, or many many many.</p>
<p>For nginx, a default catchall virtual host might look like this:</p>
<pre><span style="color: #00ff00;">server {
    listen 80 default;
    server_name can-be-anything-not-served;

    access_log /path/to/log/weird/access.log;
    error_log /path/to/log/weird/error.log;

    root /path/with/only/an/empty/index/html/file;
    index index.html;
}</span></pre>
<p>Note that this is configured to be the default listener on port 80 for this virtual host.  Make sure your actual virtual host(s) configuration does <strong><em>not</em></strong> have the 'default' option.</p>
<p>The server_name can be anything other than the actual virtual host(s) that the server is serving on port 80.</p>
<p>I usually put nothing (only empty index.html files) in that root folder for this catchall virtual host,but you're free to put other files to serve indicators to your users, or just to taunt them when they get subjected to DNS rebinding attacks unknowingly.  Just kidding about the taunting.</p>
<p>With this default catchall virtual host in place, you have a simple yet effective defense against DNS rebinding attacks!  Now watch the attacks get thwarted like eggs against a steel wall.</p>
<p>Note that this is helpful in situations where you don't expect HTTP/1.0 requests, which is usually the case in today's world.  If you have a case where you have  work with HTTP/1.0 requests, then you really shouldn't use this defense method in the exact same manner.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rayfoo.info/2010/02/dns-rebinding-defense-with-nginx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testing Slowloris against nginx</title>
		<link>http://blog.rayfoo.info/2009/10/testing-slowloris-against-nginx</link>
		<comments>http://blog.rayfoo.info/2009/10/testing-slowloris-against-nginx#comments</comments>
		<pubDate>Mon, 12 Oct 2009 05:59:24 +0000</pubDate>
		<dc:creator>ray</dc:creator>
				<category><![CDATA[Everything]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[RSnake]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[Slowloris]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[web server]]></category>

		<guid isPermaLink="false">http://blog.rayfoo.info/?p=244</guid>
		<description><![CDATA[CCCCCCCCCCOOCCOOOOO888@8@8888OOOOCCOOO888888888@@@@@@@@@8@8@@@@888OOCooocccc:::: CCCCCCCCCCCCCCCOO888@888888OOOCCCOOOO888888888888@88888@@@@@@@888@8OOCCoococc::: CCCCCCCCCCCCCCOO88@@888888OOOOOOOOOO8888888O88888888O8O8OOO8888@88@@8OOCOOOCoc:: CCCCooooooCCCO88@@8@88@888OOOOOOO88888888888OOOOOOOOOOCCCCCOOOO888@8888OOOCc:::: CooCoCoooCCCO8@88@8888888OOO888888888888888888OOOOCCCooooooooCCOOO8888888Cocooc: ooooooCoCCC88@88888@888OO8888888888888888O8O8888OOCCCooooccccccCOOOO88@888OCoccc ooooCCOO8O888888888@88O8OO88888OO888O8888OOOO88888OCocoococ::ccooCOO8O888888Cooo oCCCCCCO8OOOCCCOO88@88OOOOOO8888O888OOOOOCOO88888O8OOOCooCocc:::coCOOO888888OOCC oCCCCCOOO88OCooCO88@8OOOOOO88O888888OOCCCCoCOOO8888OOOOOOOCoc::::coCOOOO888O88OC oCCCCOO88OOCCCCOO8@@8OOCOOOOO8888888OoocccccoCO8O8OO88OOOOOCc.:ccooCCOOOO88888OO CCCOOOO88OOCCOOO8@888OOCCoooCOO8888Ooc::...::coOO88888O888OOo:cocooCCCCOOOOOO88O CCCOO88888OOCOO8@@888OCcc:::cCOO888Oc..... ....cCOOOOOOOOOOOc.:cooooCCCOOOOOOOOO OOOOOO88888OOOO8@8@8Ooc:.:...cOO8O88c. . .coOOO888OOOOCoooooccoCOOOOOCOOOO OOOOO888@8@88888888Oo:. . ...cO888Oc.. .oOOOOOOOOOCCoocooCoCoCOOOOOOOO COOO888@88888888888Oo:. .O8888C: .oCOo. ...cCCCOOOoooooocccooooooooCCCOO CCCCOO888888O888888Oo. .o8Oo. .cO88Oo: :. .:..ccoCCCooCooccooccccoooooCCCC coooCCO8@88OO8O888Oo:::... .. :cO8Oc. . ..... :. .:ccCoooooccoooocccccooooCCC :ccooooCO888OOOO8OOc..:...::. .co8@8Coc::.. .... ..:cooCooooccccc::::ccooCCooC .:::coocccoO8OOOOOOC:..::....coCO8@8OOCCOc:... ....:ccoooocccc:::::::::cooooooC ....::::ccccoCCOOOOOCc......:oCO8@8@88OCCCoccccc::c::.:oCcc:::cccc:..::::coooooo .......::::::::cCCCCCCoocc:cO888@8888OOOOCOOOCoocc::.:cocc::cc:::...:::coocccccc ...........:::..:coCCCCCCCO88OOOO8OOOCCooCCCooccc::::ccc::::::.......:ccocccc:co .............::....:oCCoooooCOOCCOCCCoccococc:::::coc::::....... ...:::cccc:cooo ..... ............. .coocoooCCoco:::ccccccc:::ccc::.......... ....:::cc::::coC . . ... .... [...]]]></description>
			<content:encoded><![CDATA[<pre><span style="font-size: 9px; line-height: 8pt;">CCCCCCCCCCOOCCOOOOO888@8@8888OOOOCCOOO888888888@@@@@@@@@8@8@@@@888OOCooocccc::::
CCCCCCCCCCCCCCCOO888@888888OOOCCCOOOO888888888888@88888@@@@@@@888@8OOCCoococc:::
CCCCCCCCCCCCCCOO88@@888888OOOOOOOOOO8888888O88888888O8O8OOO8888@88@@8OOCOOOCoc::
CCCCooooooCCCO88@@8@88@888OOOOOOO88888888888OOOOOOOOOOCCCCCOOOO888@8888OOOCc::::
CooCoCoooCCCO8@88@8888888OOO888888888888888888OOOOCCCooooooooCCOOO8888888Cocooc:
ooooooCoCCC88@88888@888OO8888888888888888O8O8888OOCCCooooccccccCOOOO88@888OCoccc
ooooCCOO8O888888888@88O8OO88888OO888O8888OOOO88888OCocoococ::ccooCOO8O888888Cooo
oCCCCCCO8OOOCCCOO88@88OOOOOO8888O888OOOOOCOO88888O8OOOCooCocc:::coCOOO888888OOCC
oCCCCCOOO88OCooCO88@8OOOOOO88O888888OOCCCCoCOOO8888OOOOOOOCoc::::coCOOOO888O88OC
oCCCCOO88OOCCCCOO8@@8OOCOOOOO8888888OoocccccoCO8O8OO88OOOOOCc.:ccooCCOOOO88888OO
CCCOOOO88OOCCOOO8@888OOCCoooCOO8888Ooc::...::coOO88888O888OOo:cocooCCCCOOOOOO88O
CCCOO88888OOCOO8@@888OCcc:::cCOO888Oc..... ....cCOOOOOOOOOOOc.:cooooCCCOOOOOOOOO
OOOOOO88888OOOO8@8@8Ooc:.:...cOO8O88c.      .  .coOOO888OOOOCoooooccoCOOOOOCOOOO
OOOOO888@8@88888888Oo:. .  ...cO888Oc..          .oOOOOOOOOOCCoocooCoCoCOOOOOOOO
COOO888@88888888888Oo:.       .O8888C:  .oCOo.  ...cCCCOOOoooooocccooooooooCCCOO
CCCCOO888888O888888Oo. .o8Oo. .cO88Oo:       :. .:..ccoCCCooCooccooccccoooooCCCC
coooCCO8@88OO8O888Oo:::... ..  :cO8Oc. . .....  :.  .:ccCoooooccoooocccccooooCCC
:ccooooCO888OOOO8OOc..:...::. .co8@8Coc::..  ....  ..:cooCooooccccc::::ccooCCooC
.:::coocccoO8OOOOOOC:..::....coCO8@8OOCCOc:...  ....:ccoooocccc:::::::::cooooooC
....::::ccccoCCOOOOOCc......:oCO8@8@88OCCCoccccc::c::.:oCcc:::cccc:..::::coooooo
.......::::::::cCCCCCCoocc:cO888@8888OOOOCOOOCoocc::.:cocc::cc:::...:::coocccccc
...........:::..:coCCCCCCCO88OOOO8OOOCCooCCCooccc::::ccc::::::.......:ccocccc:co
.............::....:oCCoooooCOOCCOCCCoccococc:::::coc::::....... ...:::cccc:cooo
 ..... ............. .coocoooCCoco:::ccccccc:::ccc::..........  ....:::cc::::coC
   .  . ...    .... ..  .:cccoCooc:..  ::cccc:::c:.. ......... ......::::c:cccco
  .  .. ... ..    .. ..   ..:...:cooc::cccccc:.....  .........  .....:::::ccoocc
       .   .         .. ..::cccc:.::ccoocc:. ........... ..  . ..:::.:::::::ccco</span></pre>
<p>Testing <a href="http://ha.ckers.org/">RSnake</a>'s <a href="http://ha.ckers.org/slowloris/">Slowloris</a> tool against a test <a href="http://nginx.org/">nginx</a> setup for myself: Though at first glance nginx is indeed not susceptible to such an attack, but observing the actual behaviour shows up some weird points.  Will write more when I have some more answers/observations.</p>
<p><a href="#conclusions">Conclusions</a> can be found at the bottom of this post, if you can't stand reading about experiments and whatnot.</p>
<h1>Edit (15 Oct)</h1>
<p>It seems that nginx <em>is</em> indeed affected by the Slowloris attack.  Whilst the attack is in progress, no other connections can be made to the server (thus causing the DOS situation).</p>
<p>Based on the way Slowloris works (sending headers slooooowly) the reason why this works against nginx is because of the max file descriptors limit.  Apparently each network connection to any process uses up one file descriptor, and the OS limits this number (ulimit in linux).  By default it is set to 1024, though it can be changed.</p>
<p>I'm not sure whether this is exactly the same as the original Slowloris attack, because Slowloris exhausts a web server specific resource (Apache's max clients for example), whereas hitting max file descriptor limits is a OS/process level "resource".</p>
<p>This is a problem nonetheless, because we could try to raise the max file descriptors limit for the nginx process, and they still can be all taken up by long-lived slow-sending HTTP requests like what Slowloris does.  The only difference is that it would take FAR more connections to Slowloris attack a nginx server successfully as compared to process-cased web servers like Apache.</p>
<p>A problem encountered so far is that nginx seems not to honour the <a href="http://wiki.nginx.org/NginxHttpCoreModule#client_header_timeout">client_header_timeout</a> directive, so it starts returning a "Request time out" status (408) to the Slowloris threads after a while, even when Slowloris is set to a far lower timeout than the nginx server is.  Will need to check up more on this, though with this behaviour nginx automatically recovers from a Slowloris attack after a while <img src='http://blog.rayfoo.info/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<h1>Edit (27 Oct)</h1>
<p>After checking out <em>id</em>s and <em>maxim</em>s reply in the forums, did some tests with the max file descriptors raised for the nginx process.  Did it not by raising the <em>ulimit -n</em> value, but by setting <a href="http://wiki.nginx.org/NginxHttpMainModule#worker_rlimit_nofile">worker_rlimit_nofile</a> to a higher value.  As a result nginx was able to take in "more" concurrent incoming connections this time, at least till the new ulimit for the nginx process was hit.</p>
<p>An interesting thing of note is that the client_header_timeout directive determines how much time a connection has to complete sending its headers for the request to be processed, and not how long nginx is willing to wait after receiving a header before it deems a connection as timed out.  This turned out to be the main factor in defending nginx against SlowLoris, when combined with nginxs other characteristics.<br />
<a id="conclusions" name="conclusions"></a></p>
<h1>Conclusions</h1>
<p>1. nginx is able to defend against small-mid scale SlowLoris attacks because it terminates requests that have not completed within a specified time (60 sec by default).  Thus the basic SlowLoris attack <span style="color: #ff0000;"><strong>WON'T</strong></span> work, since it relies on sending headers one at a time to keep a connection occupied.</p>
<p>2. nginx can be downed by SlowLoris, however, if many attack nodes are used.  We will need a total of <span style="color: #ff6600;"><em>file descriptor limit for nginx / 50</em></span> SlowLoris threads to successfully mount an attack.  50 because SlowLoris is coded to run 50 connections per thread.  This would (in theory) cause any released connections to be quickly taken up again by new SlowLoris connections.  SlowLoris would also have to be set at &lt;60 secs to work.  This is more like a DDOS attack than a SlowLoris attack though...</p>
<p>3. The problem with (2) above is that we might need a huge number of resources to mount it (DDOS level?).  If nginx was set to 100,000 max files limit, we would then need 100,000 / 50 = 2000 SlowLoris threads!</p>
<p>4. The access logs for nginx show the attack <span style="color: #ff0000;"><strong>in progress</strong></span> as it kicks out the client connections <img src='http://blog.rayfoo.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>So... nginx is a good web server, use it! <img src='http://blog.rayfoo.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rayfoo.info/2009/10/testing-slowloris-against-nginx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Weird web server access log entries</title>
		<link>http://blog.rayfoo.info/2009/10/weird-web-server-access-log-entries</link>
		<comments>http://blog.rayfoo.info/2009/10/weird-web-server-access-log-entries#comments</comments>
		<pubDate>Wed, 07 Oct 2009 04:43:44 +0000</pubDate>
		<dc:creator>ray</dc:creator>
				<category><![CDATA[Everything]]></category>
		<category><![CDATA[1Portfolio]]></category>
		<category><![CDATA[abuse]]></category>
		<category><![CDATA[anomaly]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[bad customer service]]></category>
		<category><![CDATA[ISP]]></category>
		<category><![CDATA[load balancer]]></category>
		<category><![CDATA[logs]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[Singnet]]></category>
		<category><![CDATA[web server]]></category>

		<guid isPermaLink="false">http://blog.rayfoo.info/?p=223</guid>
		<description><![CDATA[Don't have the answer to this yet, but it sure makes me really really curious as to the cause. In my web server access logs, I get plenty of entries that look like this: 69.64.58.126 - - [02/Oct/2009:14:20:55 +0800] "-" 400 0 "-" "-" That means that these IP addresses have been connecting to my [...]]]></description>
			<content:encoded><![CDATA[<p>Don't have the answer to this yet, but it sure makes me really really curious as to the cause.</p>
<p>In my web server access logs, I get plenty of entries that look like this:<br />
<code>69.64.58.126 - - [02/Oct/2009:14:20:55 +0800] "-" 400 0 "-" "-"</code></p>
<p>That means that these IP addresses have been connecting to my server via a particular domain, without sending any request whatsoever or so it seems.  And I get a LOT of accesses from Singnet IP addresses (220.255.0.0/16 range) daily.</p>
<p>Have contacted them on this, but no answers as yet.  And the only answer from a forum was that it's probably load balancer generated traffic (doesn't explain why I get many many requests from an entire Class C worth of IP addresses).</p>
<p>Not sure whether it was this thing that caused my 1Portfolio account to overuse server resources, since Apache is known to fork a new process for every new incoming connection, as opposed to web servers like Nginx. (And I'm still pissed at how they did NOT contact me whatsoever when they had to terminate my account immediately due to the resource overuse)</p>
<p>If anyone has answers/possibilities I'd sure like to hear and discuss on them!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rayfoo.info/2009/10/weird-web-server-access-log-entries/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Talk on Nginx internals</title>
		<link>http://blog.rayfoo.info/2009/09/talk-on-nginx-internals</link>
		<comments>http://blog.rayfoo.info/2009/09/talk-on-nginx-internals#comments</comments>
		<pubDate>Tue, 22 Sep 2009 16:45:22 +0000</pubDate>
		<dc:creator>ray</dc:creator>
				<category><![CDATA[Everything]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://blog.rayfoo.info/?p=121</guid>
		<description><![CDATA[For those who'd like to write plugins/modify source codes for Nginx, or simply want to know more about the fantastic software that they're using. Joshua Zhu's talk on Nginx Internals]]></description>
			<content:encoded><![CDATA[<p>For those who'd like to write plugins/modify source codes for Nginx, or simply want to know more about the fantastic software that they're using. <img src='http://blog.rayfoo.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a href="http://blog.zhuzhaoyuan.com/2009/09/nginx-internals-slides-video/">Joshua Zhu's talk on Nginx Internals</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rayfoo.info/2009/09/talk-on-nginx-internals/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Controlling Nginx from command line</title>
		<link>http://blog.rayfoo.info/2009/09/controlling-nginx-from-command-line</link>
		<comments>http://blog.rayfoo.info/2009/09/controlling-nginx-from-command-line#comments</comments>
		<pubDate>Tue, 01 Sep 2009 04:04:25 +0000</pubDate>
		<dc:creator>ray</dc:creator>
				<category><![CDATA[Everything]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://blog.rayfoo.info/?p=30</guid>
		<description><![CDATA[Just learnt of this, that Nginx can be controlled from command line, or more specifically by sending signals to the process, for example: kill -USR1 `cat /path/to/nginx.pid` causes Nginx to reopen log files, suitable for a log rotation job. The reference can be found at the wiki http://wiki.nginx.org/NginxCommandLine Just a quick list of other stuff [...]]]></description>
			<content:encoded><![CDATA[<p>Just learnt of this, that Nginx can be controlled from command line, or more specifically by sending signals to the process, for example:<br />
<code>kill -USR1 `cat /path/to/nginx.pid`</code><br />
causes Nginx to reopen log files, suitable for a log rotation job.</p>
<p>The reference can be found at the wiki <a href="http://wiki.nginx.org/NginxCommandLine">http://wiki.nginx.org/NginxCommandLine</a><br />
<span id="more-30"></span><br />
Just a quick list of other stuff that you can send signals to Nginx to do:</p>
<ul>
<li>TERM, INT =&gt; quick shutdown</li>
<li>QUIT =&gt; graceful shutdown</li>
<li>HUP =&gt; reloads configuration</li>
<li>USR1 =&gt; reopens log files</li>
<li>USR2 =&gt; upgrades the executable on the fly</li>
<li>WINCH =&gt; gracefully shutdown worker processes</li>
</ul>
<p>There're some instructions on how to do various stuffs so do check it out.</p>
<p>Thanks to Jim Ohlstein and 张立冰 for pointing this out.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rayfoo.info/2009/09/controlling-nginx-from-command-line/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>URL Shortener project, start!</title>
		<link>http://blog.rayfoo.info/2009/08/url-shortener-project-start</link>
		<comments>http://blog.rayfoo.info/2009/08/url-shortener-project-start#comments</comments>
		<pubDate>Tue, 25 Aug 2009 16:12:20 +0000</pubDate>
		<dc:creator>ray</dc:creator>
				<category><![CDATA[Everything]]></category>
		<category><![CDATA[Aptana]]></category>
		<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Jetty]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[OWASP]]></category>
		<category><![CDATA[OWASP ESAPI]]></category>
		<category><![CDATA[PHP-FPM]]></category>
		<category><![CDATA[project]]></category>
		<category><![CDATA[URL shortener]]></category>

		<guid isPermaLink="false">http://blog.rayfoo.info/2009/08/26/url-shortener-project-start</guid>
		<description><![CDATA[Started a bit on my URL Shortener project, making use of the opportunity to get my hands dirty with the CodeIgniter framework. CodeIgniter is really easy to learn and use, I'm thinking of adding OWASP's ESAPI's functionality as a plugin (if it's worth the effort) in the future, so that more people will come to [...]]]></description>
			<content:encoded><![CDATA[<p>Started a bit on my URL Shortener project, making use of the opportunity to get my hands dirty with the <a href="http://codeigniter.com/" target="_blank">CodeIgniter</a> framework.</p>
<p>CodeIgniter is really easy to learn and use, I'm thinking of adding <a href="http://www.owasp.org/index.php/Main_Page" target="_blank">OWASP</a>'s <a href="http://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API" target="_blank">ESAPI</a>'s functionality as a plugin (if it's worth the effort) in the future, so that more people will come to hear of it, and use it <img src='http://blog.rayfoo.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Meanwhile, have been stuck with a redirect loop problem when I test out my (test) codes with <a href="http://aptana.com/" target="_blank">Aptana</a>'s built-in <a href="http://www.mortbay.org/jetty/" target="_blank">Jetty</a> server, for reasons unknown. I guess I'll have to try <a href="http://nginx.net/" target="_blank">nginx</a> + <a href="http://php-fpm.org/Main_Page" target="_blank">PHP-FPM</a> to see whether the source of the problem is really Jetty, or something else...</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rayfoo.info/2009/08/url-shortener-project-start/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

