<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Phramework</title>
	<atom:link href="https://phramework.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://phramework.wordpress.com</link>
	<description>A Free, Collaborative PHP Framework</description>
	<lastBuildDate>Wed, 21 Oct 2009 04:43:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='phramework.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>https://s0.wp.com/i/buttonw-com.png</url>
		<title>Phramework</title>
		<link>https://phramework.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="https://phramework.wordpress.com/osd.xml" title="Phramework" />
	<atom:link rel='hub' href='https://phramework.wordpress.com/?pushpress=hub'/>
	<item>
		<title>Securing page requests &#8211; Phramework::findRequestedPage()</title>
		<link>https://phramework.wordpress.com/2009/10/21/securing-page-requests-findrequestedpage/</link>
					<comments>https://phramework.wordpress.com/2009/10/21/securing-page-requests-findrequestedpage/#respond</comments>
		
		<dc:creator><![CDATA[arranschlosberg]]></dc:creator>
		<pubDate>Wed, 21 Oct 2009 03:08:59 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[directory traversal]]></category>
		<category><![CDATA[findRequestedPage]]></category>
		<category><![CDATA[fully qualified domain name]]></category>
		<category><![CDATA[IP address]]></category>
		<category><![CDATA[null byte]]></category>
		<category><![CDATA[Phramework.php]]></category>
		<category><![CDATA[remote file includes]]></category>
		<guid isPermaLink="false">http://phramework.wordpress.com/?p=52</guid>

					<description><![CDATA[The central idea behind this framework is to have each request handled by a centralised and secure core that manages repetitive tasks for us. In order to achieve this we redirected all requests to a single index.php file by implementing .htaccess RewriteRules to set the value of $_GET[&#8216;page&#8217;]. While these rules will only pass secure [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>The central idea behind this framework is to have each request handled by a centralised and secure core that manages repetitive tasks for us. In order to achieve this we redirected all requests to a single <em>index.php</em> file by implementing <a href="https://phramework.wordpress.com/2009/10/15/mod-rewrite-and-htaccess/">.htaccess RewriteRules</a> to set the value of <em>$_GET[&#8216;page&#8217;]</em>. While these rules will only pass secure values to our script it is always possible to bypass them by directly accessing <em>index.php?page=some-malicious-path</em> and we therefore need to address this threat.</p>
<p><span id="more-52"></span>Before we can address the threat we need to have an understanding of exactly what we are trying to protect against. The final &#8220;clean&#8221; version of the requested page will be used for file includes which have a particular set of threats:</p>
<ol>
<li>Root directory access &#8211; a UNIX path that begins with a forward slash (/) is an absolute path. As this can access any directory on the system we clearly do not want this. <em>Mitigation &#8211; check the first character.</em></li>
<li>Directory traversal &#8211; UNIX designates the parent directory as two fullstops (..) which, if allowed, can once again permit access to any directory on the system. A sufficient number of parent directories (../../../../ etc.) is equivalent to root directory access. <em>Mitigation &#8211; check for fullstops.</em></li>
<li>Remote file includes &#8211; if we were to allow any piece of code to be included an attacker could create their own PHP script, host it anywhere and reference it in the path provided &#8211; e.g. <em>index.php?page=http://malicious-domain.tld/script</em> which is clearly not an ideal situation. Something important to know is that a reference to a remote script relies on either a <a href="http://en.wikipedia.org/wiki/Fully_qualified_domain_name">fully qualified domain name</a> or an IP address, both of which must contain at least one fullstop. <em>Mitigation &#8211; check for fullstops &#8211; same as (2).</em></li>
<li>Null bytes (%00) will cause PHP to truncate the end of a string. It is easy to believe that because we will be placing &#8220;.php&#8221; at the end of our include statement that we are safe. However, <em>include &#8220;malicious-path%00.php&#8221;;</em> and <em>include &#8220;malicious-path&#8221;;</em> are equivalent. <em>Mitigation &#8211; check for a null byte.</em></li>
<li>Unknown &#8211; it is very possible that we have not covered all threats here and it is definitely a sound security measure to include a final catch-all check. As this negates the need for all previous checks it is possible to only utilise this approach, however a <em><a href="http://en.wikipedia.org/wiki/Defense_in_Depth_(computing)">defense in depth</a><span style="font-style:normal;"> strategy is advisable. </span>Mitigation &#8211; duplicate the regular expressions used in the <a href="https://phramework.wordpress.com/2009/10/15/mod-rewrite-and-htaccess/">RewriteRules</a>.</em></li>
</ol>
<p>For now, the response to a potentially malicious path will simply be to redirect the user to the home page <em>main</em>, but in the future we will always have the ability to log the incident and potentially temporarily block the IP address<sup><strong>1</strong></sup>. As all responses are the same (and so too is the response to an empty page request) we can utilise a try-catch statement and throw an <a href="http://php.net/manual/en/language.exceptions.php">exception</a> any time we detect a problem. For brevity I have excluded the full function definition but note that the only parameter is <em>$dirty</em> which will receive <em>$_GET[&#8216;page&#8217;]</em>.</p>
<blockquote><p>try {</p>
<p style="padding-left:30px;">if(empty($dirty)) throw new Exception();  //nothing provided</p>
<p style="padding-left:30px;">if(substr($dirty, 0, 1)==&#8221;/&#8221;) throw new Exception();  //point (1)</p>
<p style="padding-left:30px;">if(strpos($dirty, &#8220;.&#8221;)!==false) throw new Exception(); //points (2) and (3)</p>
<p style="padding-left:30px;">if(!preg_match(&#8220;/^(?:[\/a-z0-9_-]+)$/i&#8221;, $dirty)) throw new Exception(); //points (4) and (5)</p>
<p style="padding-left:30px;">$clean = strtolower($dirty); //it passed all the tests</p>
<p>}</p>
<p>catch(Exception $e){ //something is wrong so send them to the home page</p>
<p style="padding-left:30px;">$clean = &#8220;main&#8221;;</p>
<p>}</p></blockquote>
<p>Should the &#8220;dirty&#8221; string fail any of our tests then we automatically default to the home page by catching the exception. Note the use of the negative double equality (!==) and not the single (!=); as zero (0) is registered as false by PHP the single will fail to throw an exception if the first character matches (returning an index of 0). The use of the double enforces matching of the boolean false (no match).</p>
<p>In conforming with the <a href="https://phramework.wordpress.com/2009/10/15/mod-rewrite-and-htaccess/">URL conventions</a> we need to handle the case of a trailing slash (/) which is a request for the directory index <em>main</em>.</p>
<blockquote><p>if(substr($clean, -1)==&#8221;/&#8221;) $clean .= &#8220;main&#8221;;</p></blockquote>
<p>Now that we have a &#8220;clean&#8221; path we can set it as a constant using <em>Phramework::define()</em> as detailed in <a href="https://phramework.wordpress.com/2009/10/20/phramework-class-and-extending-the-define-function/">the last post</a>. Later in the development it will prove useful to also have the path broken down into an array describing the directory structure. This storage of &#8220;clean&#8221; data is the exact reason why there is no unlocking function associated with <em>define</em>.</p>
<blockquote><p>$this-&gt;define(&#8216;PAGE&#8217;, $clean);</p>
<p>$this-&gt;define(&#8216;PAGES&#8217;, explode(&#8220;/&#8221;, $clean));</p></blockquote>
<p>If I have overlooked any issues please let me know via a comment. If anyone would like to write a unit test for this function it would be much appreciated.</p>
<p><a href="http://phramework.arranschlosberg.com/Phramework.php.txt">Current text version of Phramework.php</a></p>
<p><sup><strong>1</strong></sup> Later in the development of Phramework I will detail implementation of an <a href="http://phpids.org/">intruder detection system</a> and our responses.</p>
<div id="_mcePaste" style="overflow:hidden;position:absolute;left:-10000px;top:0;width:1px;height:1px;">
<pre>if(substr($dirty, 0, 1)=="/"){</pre>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://phramework.wordpress.com/2009/10/21/securing-page-requests-findrequestedpage/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
		<media:content url="https://2.gravatar.com/avatar/ee27c6c39a6816be507fa6f2fd745e669c5c05710bac5a3b3cd253795af12130?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">arranschlosberg</media:title>
		</media:content>
	</item>
		<item>
		<title>Phramework class &#038; extending the define function</title>
		<link>https://phramework.wordpress.com/2009/10/20/phramework-class-and-extending-the-define-function/</link>
					<comments>https://phramework.wordpress.com/2009/10/20/phramework-class-and-extending-the-define-function/#respond</comments>
		
		<dc:creator><![CDATA[arranschlosberg]]></dc:creator>
		<pubDate>Tue, 20 Oct 2009 09:05:22 +0000</pubDate>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[define]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[magic methods]]></category>
		<category><![CDATA[Phramework.php]]></category>
		<category><![CDATA[singleton]]></category>
		<guid isPermaLink="false">http://phramework.wordpress.com/?p=38</guid>

					<description><![CDATA[The core of the framework will be focused around a single object, an instance of the Phramework class. Admittedly, this first post regarding the class is quite tedious however it is nonetheless quite essential. As this Phramework object is representative of a single request there should only ever be one such instance per Apache process, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>The core of the framework will be focused around a single object, an instance of the <em>Phramework</em> class. Admittedly, this first post regarding the class is quite tedious however it is nonetheless quite essential.<span id="more-38"></span></p>
<p>As this <em>Phramework</em> object is representative of a single request there should only ever be one such instance per Apache process, thus <em>Phramework</em> should implement the <a href="http://php.net/manual/en/language.oop5.patterns.php">singleton pattern</a>. The singleton code is an exact copy of that provided by the PHP documentation and results in object instantiation by:</p>
<blockquote><p>$p = Phramework::singleton(); //returns the same instance no matter where it is called from<br />
$p = new Phramework(); //triggers an error as the <em>Phramework</em> constructor is private</p></blockquote>
<p>Before developing the functions to handle the page requested via the <a href="https://phramework.wordpress.com/2009/10/15/mod-rewrite-and-htaccess/">.htaccess RewriteRules</a> there is some basic functionality that needs to be implemented for storage of data. Particularly, the <a href="http://au2.php.net/manual/en/function.define.php">define function</a> needs to be reworked in order to allow values other than scalars (null, integer, string, float and boolean), such as arrays and objects, to be stored. This will be useful later on for security reasons as we will only define &#8220;clean&#8221; values.</p>
<p>In order to do this, we rely on the <a href="http://php.net/manual/en/language.oop5.magic.php">PHP magic methods</a> <em>__set()</em> and <em>__get()</em><sup><strong>1</strong></sup>. These methods are called when there is an attempt to declare (__set) or retrieve (__get) an attribute of an object that has not been explicitly declared<sup><strong>2</strong></sup>. As we are extending the <em>define</em> function we need to declare two arrays; the first for storage of values and the second for storage of &#8220;locked&#8221; keys.</p>
<blockquote><p>private $values = array();<br />
private $locked = array();</p></blockquote>
<p>Before attempting to save a value into the $values array, __set will first check that the key is not in the $locked array. Return values mimic the standard PHP define function.</p>
<blockquote><p>public function __set($key, $val){</p>
<p style="padding-left:30px;">//Check for no locking before saving<br />
if(!in_array($key, $this-&gt;locked)){</p>
<p style="padding-left:60px;">$this-&gt;values[$key] = $val;<br />
return true;</p>
<p style="padding-left:30px;">}<br />
return false;</p>
<p>}</p></blockquote>
<p>With this check in place, all that is needed is a function to lock a particular key (note that a key should not be able to be unlocked so we don&#8217;t define the corresponding function).</p>
<blockquote><p>public function lock($key){</p>
<p style="padding-left:30px;">if(!in_array($key, $this-&gt;locked)){</p>
<p style="padding-left:60px;">$this-&gt;locked[] = $key;</p>
<p style="padding-left:30px;">}</p>
<p>}</p></blockquote>
<p>Now comes the final step, the extended <em>define</em> function. Technically this is just a convenience wrapper for setting a value and then locking it. Once again, return values should mimic those of the original PHP <em>define</em> function. In the event that we are defining a value and it already exists but is not locked, I have decided to trigger a warning as a courtesy.</p>
<blockquote><p>public function define($key, $val){</p>
<p style="padding-left:30px;">//Overwriting?</p>
<p style="padding-left:30px;">if(isset($this-&gt;values[$key]) &amp;&amp; !in_array($key, $this-&gt;locked)){</p>
<p style="padding-left:60px;">trigger_error(&#8220;Value of Phramework::{$key} is being overwritten by Phramework::define()&#8221;, E_USER_WARNING);</p>
<p style="padding-left:30px;">}</p>
<p style="padding-left:30px;">if($this-&gt;__set($key, $val)){</p>
<p style="padding-left:60px;">$this-&gt;lock($key);<br />
return true;</p>
<p style="padding-left:30px;">}</p>
<p style="padding-left:30px;">return false;</p>
<p>}</p></blockquote>
<p>Note that if the value is already locked then <em>__set()</em> will return false and so too will <em>Phramework::define()</em>.</p>
<p>With these basics in place we are able to move on to the first interesting method <em>Phramework::findRequestedPage()</em> which will be discussed in the next post.</p>
<p><a href="http://phramework.arranschlosberg.com/Phramework.php.txt">Current text version of Phramework.php</a></p>
<p><sup><strong>1</strong></sup> I believe that having all methods and attributes of the Phramework class being <a href="http://php.net/manual/en/language.oop5.static.php">static</a> would provide a better solution than the singleton pattern described above but these two magic methods cannot be declared statically.</p>
<p><sup><strong>2</strong></sup> While their use in this case is simple, later in the project I will demonstrate a more complex and particularly useful implementation of __set and __get with regards to database access.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://phramework.wordpress.com/2009/10/20/phramework-class-and-extending-the-define-function/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
		<media:content url="https://2.gravatar.com/avatar/ee27c6c39a6816be507fa6f2fd745e669c5c05710bac5a3b3cd253795af12130?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">arranschlosberg</media:title>
		</media:content>
	</item>
		<item>
		<title>mod_rewrite &#038; .htaccess</title>
		<link>https://phramework.wordpress.com/2009/10/15/mod-rewrite-and-htaccess/</link>
					<comments>https://phramework.wordpress.com/2009/10/15/mod-rewrite-and-htaccess/#respond</comments>
		
		<dc:creator><![CDATA[arranschlosberg]]></dc:creator>
		<pubDate>Thu, 15 Oct 2009 02:15:20 +0000</pubDate>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[.htaccess]]></category>
		<category><![CDATA[index.php]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<guid isPermaLink="false">http://phramework.wordpress.com/?p=16</guid>

					<description><![CDATA[In order to achieve the centralised (it&#8217;s not a typo, I&#8217;m an Aussie) parser outlined in the framework architecture we will need to have all relevant requests directed to index.php and block direct requests to any PHP page. For this, Apache&#8217;s mod_rewrite is a perfect tool and I will assume that you have some knowledge [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>In order to achieve the centralised (it&#8217;s not a typo, I&#8217;m an Aussie) parser outlined in the <a href="https://phramework.wordpress.com/2009/10/15/framework-architecture/" target="_self">framework architecture</a> we will need to have all relevant requests directed to <em>index.php</em> and block direct requests to any PHP page. For this, Apache&#8217;s <a href="http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html">mod_rewrite</a> is a perfect tool and I will assume that you have some knowledge of <a href="http://en.wikipedia.org/wiki/Regular_expression">regular expressions</a> (there are great cheat sheets available for both <a href="http://www.addedbytes.com/apache/mod_rewrite-cheat-sheet/">mod_rewrite</a> and <a href="http://www.addedbytes.com/cheat-sheets/regular-expressions-cheat-sheet/">regular expressions</a>).<span id="more-16"></span></p>
<p>Here we will be dealing with the path of the URL (the part that tells the server what page is being requested). This is generally separated into a directory structure by forward slashes (/). The URL conventions are:</p>
<ul>
<li>Allowed characters are alpha (a-z), numeric (0-9), hyphen (-) and underscore (_)</li>
<li>A trailing slash (/) will be treated as if the directory index has been requested</li>
<li>The directory index is called <em>main</em></li>
<li>At least one page or directory is required</li>
<li>URLs have no extension</li>
</ul>
<p>This first rule matches for a URL with any number of directories (zero or more) as well as a specific file:</p>
<blockquote><p>RewriteRule ^([a-z0-9_-]+)((\/[a-z0-9_-]+)*)$ index.php?page=$1$2 [NC,L,QSA]</p></blockquote>
<p>The first set of parentheses match the mandatory page or directory. The second set is almost identical except for the fact that every remaining part will be prefixed with a slash (/). This path is then concatenated as a single string and passed to <em>index.php</em> for handling. Note that it is not case-sensitive (NC), it is a final match (L) and any query string is still passed (QSA).</p>
<p>A couple of examples:</p>
<ul>
<li><em>my-path</em> is rewritten as <em>index.php?page=my-path</em></li>
<li><em>directory/structure/to/my-path</em> is matched as <em>$1 = directory</em> while <em>$2 = /structure/to/my-path</em> and is rewritten as <em>index.php?page=directory/structure/to/my-path</em></li>
</ul>
<p>This second rule is almost identical to the first. The only difference is the inclusion of a trailing slash which, as described in the conventions, is a request for the directory index called <em>main</em>.</p>
<blockquote><p>RewriteRule ^([a-z0-9_-]+)((\/[a-z0-9_-]+)*)\/$ index.php?page=$1$2/main [nc,L,QSA]</p></blockquote>
<p>An example:</p>
<ul>
<li><em>directory/</em> is equivalent to <em>directory/main</em> and is rewritten as <em>index.php?page=directory/main</em></li>
</ul>
<p>I am by no means an expert in mod_rewrite nor regular expressions and I am quite confident that the efficiency of these two rules can be greatly improved. If you have any suggestions please post them as comments.</p>
<p><a href="http://phramework.arranschlosberg.com/htaccess.txt">Current text version of .htaccess</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://phramework.wordpress.com/2009/10/15/mod-rewrite-and-htaccess/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
		<media:content url="https://2.gravatar.com/avatar/ee27c6c39a6816be507fa6f2fd745e669c5c05710bac5a3b3cd253795af12130?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">arranschlosberg</media:title>
		</media:content>
	</item>
		<item>
		<title>Framework Architecture</title>
		<link>https://phramework.wordpress.com/2009/10/15/framework-architecture/</link>
					<comments>https://phramework.wordpress.com/2009/10/15/framework-architecture/#respond</comments>
		
		<dc:creator><![CDATA[arranschlosberg]]></dc:creator>
		<pubDate>Thu, 15 Oct 2009 01:11:41 +0000</pubDate>
				<category><![CDATA[Getting started]]></category>
		<guid isPermaLink="false">http://phramework.wordpress.com/?p=11</guid>

					<description><![CDATA[There are numerous repetitive tasks that need to be processed for every request to a PHP based website. Thus the architecture of the framework needs to encompass this. All requests will be parsed through a single file to handle these repetitive tasks before handling those specific to the request. Where appropriate, common OOP design patterns [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>There are numerous repetitive tasks that need to be processed for every request to a PHP based website. Thus the architecture of the framework needs to encompass this. All requests will be parsed through a single file to handle these repetitive tasks before handling those specific to the request.<span id="more-11"></span></p>
<p>Where appropriate, common <a href="http://en.wikipedia.org/wiki/Object-oriented_programming" target="_self">OOP</a> design patterns or modifications thereof will be used. The first that comes to mind is the <a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller" target="_self">MVC</a> pattern. I have found that a direct implementation of this pattern can sometimes be limiting and therefore use a modified approach while maintaining the strict separation of logic and presentation. This will be detailed when we reach this section of the development and as usual, commentary is encouraged.</p>
<p>The framework will be built with the following <a href="http://en.wikipedia.org/wiki/LAMP_(software_bundle)" target="_self">LAMP</a> software in mind:</p>
<ul>
<li>Linux distribution independent</li>
<li>Apache 2.x</li>
<li>PHP 5.x</li>
<li>MySQL 5.x with other database connectivity planned for in the future</li>
<li><a href="http://www.danga.com/memcached/">memcached</a> &#8211; a distributed, memory-based caching system</li>
</ul>
<p>Check out the first step in creating this architecture &#8211; <a href="https://phramework.wordpress.com/2009/10/15/mod-rewrite-and-htaccess/">mod_rewrite &amp; .htaccess</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://phramework.wordpress.com/2009/10/15/framework-architecture/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
		<media:content url="https://2.gravatar.com/avatar/ee27c6c39a6816be507fa6f2fd745e669c5c05710bac5a3b3cd253795af12130?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">arranschlosberg</media:title>
		</media:content>
	</item>
		<item>
		<title>Project Goals</title>
		<link>https://phramework.wordpress.com/2009/10/15/project-goals/</link>
					<comments>https://phramework.wordpress.com/2009/10/15/project-goals/#respond</comments>
		
		<dc:creator><![CDATA[arranschlosberg]]></dc:creator>
		<pubDate>Thu, 15 Oct 2009 00:53:20 +0000</pubDate>
				<category><![CDATA[Getting started]]></category>
		<guid isPermaLink="false">http://phramework.wordpress.com/?p=3</guid>

					<description><![CDATA[For the past 2 years I have iteratively built a PHP framework for use across all of my projects. It has now reached the point at which, in the spirit of FOSS, I believe it would be beneficial for both the framework and the wider PHP community if I were to release the code publicly. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>For the past 2 years I have iteratively built a PHP framework for use across all of my projects. It has now reached the point at which, in the spirit of <a href="http://en.wikipedia.org/wiki/Free_and_Open_Source_Software" target="_blank">FOSS</a>, I believe it would be beneficial for both the framework and the wider PHP community if I were to release the code publicly.<span id="more-3"></span></p>
<p>However, in the interests of community involvement, I will be doing so in a progressive manner. As each element is released as a blog post, I will call for comments, criticisms, recommendations or applause. In response to such commentary I will make all necessary adjustments and mold the framework accordingly.</p>
<p>Through this I hope to collaboratively build a framework that encompasses the following:</p>
<ul>
<li>Free &#8211; all software requirements and code will be free to use for both commercial and non-commercial projects (see the <a href="https://phramework.wordpress.com/terms-of-use/" target="_self">terms of use</a>)</li>
<li>Computational efficiency &#8211; benchmarked for both speed and memory usage</li>
<li>Human efficiency &#8211; automation of regular tasks in order to promote rapid development</li>
<li>Secure &#8211; implicit controls to limit the extent of human errors that cause security vulnerabilities</li>
<li>Horizontal scalability &#8211; particularly with regards to data caching</li>
</ul>
<p>I invite everyone to <a href="http://feeds.feedburner.com/phramework">subscribe to our RSS feed</a> and provide input at every stage of the development. In the end we will all benefit.</p>
<p>Check out the first post &#8211; <a href="https://phramework.wordpress.com/2009/10/15/framework-architecture/" target="_self">Framework Architecture</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://phramework.wordpress.com/2009/10/15/project-goals/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
		<media:content url="https://2.gravatar.com/avatar/ee27c6c39a6816be507fa6f2fd745e669c5c05710bac5a3b3cd253795af12130?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">arranschlosberg</media:title>
		</media:content>
	</item>
	</channel>
</rss>
