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

<channel>
	<title>SeanBluestone.com &#187; PHP</title>
	<atom:link href="http://www.seanbluestone.com/category/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.seanbluestone.com</link>
	<description></description>
	<lastBuildDate>Sat, 19 Feb 2011 17:54:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>The Developers and Programmers Passwords 101</title>
		<link>http://www.seanbluestone.com/the-developers-and-programmers-passwords-101</link>
		<comments>http://www.seanbluestone.com/the-developers-and-programmers-passwords-101#comments</comments>
		<pubDate>Wed, 03 Feb 2010 16:09:25 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.seanbluestone.com/?p=1466</guid>
		<description><![CDATA[If you&#8217;ve ever designed a user registration script, a membership site or any script that creates or stores user passwords, there are some practices which every good developer should be aware of. While most small scale applications are not in danger of being targeted by anyone with malicious intent (simply due to the fact that [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;ve ever designed a user registration script, a membership site or any script that creates or stores user passwords, there are some practices which every good developer should be aware of. While most small scale applications are not in danger of being targeted by anyone with malicious intent (simply due to the fact that they don&#8217;t have enough user accounts to make a blip on the radar), there is a point in the life of any good script whereby it becomes large enough that people can and will target your password list and security will become an issue. By implementing a few simple measures and understanding how password security is compromised you can limit the possibility of your password list being compromised and minimize the potential damage caused.</p>
<h3>1. Hash &amp; Salt</h3>
<p>One of the most commonly committed cardinal sins of password storage is plain text- that is, storing passwords in plain text. This is frightfully common and I even remember one shocking instance of a fairly popular web application storing password and username combinations in a .txt file. Storing passwords in plain text is not only lazy, it&#8217;s a huge security risk. The most common method of storing usernames and passwords is within a MySQL table via PHP. This article explains <a title="Password Hashing" href="http://phpsec.org/articles/2005/password-hashing.html" target="_blank">the fundamentals of password hashing</a> in such a setup, how it works, why it works and how easy it is to implement.</p>
<p>But, in a nutshell, hashing is the process of performing a one way algorithm on a user-supplied password so you can store it as a value which is useless by itself. Any potential hacker would also need to know your local hashing algorithm before they stood even a chance of brute forcing their way in to that account. Furthermore, brute force and dictionary attacks can also overcome by the simple salting method whereby you generate a unique salt for each password locally and store this with the hashed password.</p>
<p>The article linked provides PHP code to hash, salt and store passwords in a secure manner and provides much more information than I could hope to.</p>
<h3>2. Passwords Will Be As Secure As You Require Them To Be</h3>
<p>People are like lightning; they take the path of least resistance. In the realm of passwords, this means people will magnetize towards the shortest and most easy to remember possibility. In short, what this means is that if you have no restriction on the number of characters or types of characters allowed in your passwords, you will end up with passwords like &#8216;abc&#8217;, &#8217;123&#8242;, &#8216;password&#8217; and &#8216;secret&#8217;. This is not an exaggeration for dramatic effect, people <span style="text-decoration: underline;">will</span> actually choose and use these types of passwords.</p>
<p>By enforcing some, if not all, of the restrictions below you can ensure the security of your password list will greatly increase:</p>
<p><strong>Minimum character length.</strong> Require at least 8 characters. It is generally accepted and confirmed that 8 characters is the minimum required to generate a secure password. You may be scared to enforce long passwords in the fear that people will simply not sign up, but this is a misguided fear. If someone wants to sign up for your site the password field requiring an extra 2 characters on top of their existing password is an unlikely deterrent.</p>
<p>Other password enforcement policies should include:</p>
<ul>
<li>Password must contain characters and numbers.</li>
<li>Password must contain uppercase and lowercase characters.</li>
<li>Password must contain at least 1 symbol (outwith a-Z 0-9).</li>
<li>Password must not be based on a dictionary word.</li>
</ul>
<p><a href="http://www.passwordmeter.com/" target="_blank">The Password Meter</a> is an excellent resource to test the strength of a password while having a look at how it&#8217;s being analyzed. The script is free to download for use with your own applications. While there are pros and cons of making password strength a requirement, there is absolutely no reason not to show strength to the user in a system like this.</p>
<p>As a side note, never require passwords to be too strong. An 8 character password that someone remembers is much more secure than a 16 character password which has to be written down or saved on a desktop (and is therefor susceptible to being hijacked).</p>
<h3>3. Retrieval/Reset Mechanisms</h3>
<p>Password retrieval is part of password management which, in the field, commonly has vulnerabilities and programmer induced pitfalls. The most common mistake made, bar none, is to send out the users current password upon request. I.e. the user forgets password, clicks the &#8216;forgotten password&#8217; link and enters their email. The script sends out a copy of their password via email and they get access to their account again. The problem here lies in the fact that hashing is one way. If you store the users password as a hashed value there is no way to send out a plain text version.</p>
<p>Therefor, any site or service you are registered with which sends you a copy of your existing password upon request is <strong>not maintaining your password</strong> securely. This is a useful tip to know, especially if you are using the same password on more than one site.</p>
<p>Instead, when someone clicks &#8216;forgot password&#8217; and enters their email, the savvy programmer will have his script generate a new password, send it to the specified email, then store it in his database using <a href="http://www.seanbluestone.com/the-developers-and-programmers-passwords-101#hash">hash &amp; salt</a>. This means the user will need to take the extra step of changing their password to something memorable again, but vastly improves the security of your password system and keeps the user safe.</p>
<h3>4. Lockout Mechanism</h3>
<p>An importantly overlooked part of maintaining a secure password system is having a lockout mechanism. This is a system whereby someone can report their account as hijacked or compromised which, upon review, will be temporarily locked. This prevents compromised accounts being used for malicious purposes. For example if someone gets access to Mrs Bloggs account, logs in as her and sends a message to Mr Blogg asking for his email address password or bank account details so she can &#8220;make a payment to the Jones&#8217; next door&#8221; (better thought out rouges involving other personal info have been used successfully in the field). It&#8217;s uncommon, but it does happen and having a lockout mechanism limits damage caused and protects your users from each other.</p>
<p>An additional lockout mechanism which virtually negates the possibility of brute force attacks is password lockout. Include a simple script to count login attempts. If there are more than 3 failed login attempts, per minute for example, then lockout login attempts for that account for an hour. This makes it very unlikely for dictionary or brute force attacks to succeed and/or go unnoticed.</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 271px; width: 1px; height: 1px;">Passwords are as secure as you require them to be.</div>
]]></content:encoded>
			<wfw:commentRss>http://www.seanbluestone.com/the-developers-and-programmers-passwords-101/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bash.org Clone PHP Script for IRC Quotes</title>
		<link>http://www.seanbluestone.com/bash-org-clone-php-script-for-irc-quotes</link>
		<comments>http://www.seanbluestone.com/bash-org-clone-php-script-for-irc-quotes#comments</comments>
		<pubDate>Mon, 27 Jul 2009 10:34:43 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.seanbluestone.com/?p=981</guid>
		<description><![CDATA[Having had a few hours free last night and being part of a rather quirky IRC server I decided to code up a clone of Bash.org&#8217;s quote database system. My script replicates and clones bash.org almost entirely and has the following features: Stores an almost infinite number of quotes or comments. Allows users to rate [...]]]></description>
			<content:encoded><![CDATA[<p>Having had a few hours free last night and being part of a rather quirky IRC server I decided to code up a clone of Bash.org&#8217;s quote database system. My script replicates and clones bash.org almost entirely and has the following features:</p>
<ul>
<li>Stores an almost infinite number of quotes or comments.</li>
<li>Allows users to rate comments up or down and has minimal duplicate voting protection.</li>
<li>Optional captcha system on &#8216;add a quote&#8217; page.</li>
<li>Search, Random, Browse &amp; Other Bash.org features.</li>
<li>Admin/moderation option to delete quotes.</li>
</ul>
<p>The script is also surprisingly simple and is all contained within one file. After running the SQL within that file you can drag and drop it into anywhere on your server and it will work immediately.</p>
<p>You can see a <a href="http://www.seanbluestone.com/bash.php">demo of it in action here</a> (be warned: this section of the site is NOT safe for work and contains offensive material).</p>
<p>You can <a href="http://www.seanbluestone.com/files/bashclone.rar">download the IRC quotes database script here</a>. To install simply run the SQL statements within the php file in MySQL, edit the settings and upload. It&#8217;s extremely simple to setup and use and you can customize the look, feel and layout all from the .php file.</p>
<p>If you use this script on your site please let me know and I&#8217;ll put up a link to you here or leave a comment with your URL. Feel free to remove the &#8216;powered by&#8217; but if you do, please consider <a href="http://www.seanbluestone.com/buy-sean-a-coffee">making a small donation</a> to make it worth my while.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.seanbluestone.com/bash-org-clone-php-script-for-irc-quotes/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>PHP Jokes and Puns</title>
		<link>http://www.seanbluestone.com/php-jokes-and-puns</link>
		<comments>http://www.seanbluestone.com/php-jokes-and-puns#comments</comments>
		<pubDate>Fri, 24 Jul 2009 21:58:09 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.seanbluestone.com/?p=962</guid>
		<description><![CDATA[For no specific reason whatsoever, here are a collection of PHP Jokes and puns. Most of which are terrible. Q: Why do PHP programmers dislike ASP programmers? A: ASP programmers only write basic code. Q: Why is PHP freddy krugers language of choice? A: addslashes(); What did the PHP script say to the server? Pass [...]]]></description>
			<content:encoded><![CDATA[<p>For no specific reason whatsoever, here are a collection of PHP Jokes and puns. Most of which are terrible.</p>
<p>Q: Why do PHP programmers dislike ASP programmers?<br />
A: ASP programmers only write basic code.</p>
<p><?php</p>
<p>if($girl['looks'] == "hot"){<br />
if($beer == "cold"){<br />
$life = "Sorted!";<br />
}elseif(function_exists($girl_get_beer) == true){<br />
if(msg_send ($girl['job_que'], 1, 'Get me a beer out of the fridge!') === false){<br />
$life = "Get a new girl!";<br />
}<br />
}else{<br />
array_push($girl['functions'], 'get_beer');<br />
}<br />
}else{<br />
$life = "Get a new girl!";<br />
}<br />
echo $life;</p>
<p>?></p>
<p>Q: Why is PHP freddy krugers language of choice?<br />
A: addslashes();</p>
<p>What did the PHP script say to the server?<br />
Pass me a bottle of water, I&#8217;m parsed.</p>
<p><?php<br />
if(crack_check($woman, $dirty)) { ob_clean(); link("/home/me", "home/her"); }<br />
?></p>
<p>Yo mamma so easy, PHP developers confuse her with Ruby on Rails.<br />
Your momma so fat I called her and got a stack overflow.<br />
Your momma&#8217;s so fat, she needs preg_replace() just to make her fit in a page.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.seanbluestone.com/php-jokes-and-puns/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How to Use Akismet in Your Own Plugins and Applications</title>
		<link>http://www.seanbluestone.com/how-to-use-akismet-in-your-own-plugins-and-applications</link>
		<comments>http://www.seanbluestone.com/how-to-use-akismet-in-your-own-plugins-and-applications#comments</comments>
		<pubDate>Fri, 07 Nov 2008 18:51:12 +0000</pubDate>
		<dc:creator>Sean</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.seanbluestone.com/?p=518</guid>
		<description><![CDATA[Akismet, for those who don&#8217;t know, is an excellent and free plugin which comes installed and activated with each copy of WordPress. When activated, all comments submitted to your blog will pass through Akismets database which checks to see if the comment is recognized as spam. If so the comment is held in a moderation [...]]]></description>
			<content:encoded><![CDATA[<p>Akismet, for those who don&#8217;t know, is an excellent and free plugin which comes installed and activated with each copy of WordPress. When activated, all comments submitted to your blog will pass through Akismets database which checks to see if the comment is recognized as spam. If so the comment is held in a moderation queue for you to check or delete. It&#8217;s very useful because if a spam message gets through then you can click &#8216;spam&#8217; to delete it. Akismet learns from your selection and the next time a similar message is submitted on anyones blog it will likely be treated as spam.</p>
<p>A question I commonly see in the WordPress forums is <b>Can I use Akismet in my own program?</b> and the main benefit is that Akismet isn&#8217;t just restricted to WordPress, it can be used in third party plugins or applications. This is excellent if you&#8217;re creating or modifying an existing PHP script and it&#8217;s likely to be hit by spam. I recently developed a <a href="http://www.seanbluestone.com/wp-link-directory">WordPress Link Directory plugin</a> which, like all link directories, suffers from spam problems. In newer versions I offer Akismet and CAPTCHA as two solutions to this problem. If Akismet is chosen, all submitted links are checked against Akismet to see if they are spam and rejected or approved accordingly.</p>
<p>So how do you use Akismet in your own WordPress plugin? It&#8217;s very simple. First of all you need to download an Akismet PHP class from <a href="http://akismet.com/development/">this page</a>. A good choice is <a href="http://www.achingbrain.net/stuff/akismet/">the PHP 5 class</a> which includes a good document on how to use it. But here are the basic steps using WordPress Link Directory as an example.</p>
<p>First I check to see if the user has set the Use Akismet option to Yes and if so include the Akismet.class.php file:</p>
<p>[sourcecode language="php"]if(get_option(&#8216;wplinkdir_akismet_use&#8217;)==&#8217;Yes&#8217;){<br />
	include &#8216;Akismet.class.php&#8217;;[/sourcecode]</p>
<p>If so then I initiate a new Akismet class with whichever domain name the plugin is being used on (by getting the siteurl and Akismet key options. I also check that the key is valid before I initiate the Akismet class:</p>
<p>[sourcecode language="php"]	$Key=get_option(&#8216;wplinkdir_akismet_key&#8217;);<br />
	$SiteURL=get_option(&#8216;siteurl&#8217;);</p>
<p>	if(!$akismet->isKeyValid($Key)) {<br />
		echo &#8220;The Akismet key you supplied doesn&#8217;t appear to be valid. We cannot use Akismet without a key.&#8221;;<br />
	}else{<br />
		$akismet = new Akismet($SiteURL,$Key);[/sourcecode]</p>
<p>If the key is valid I collect the values I want to check. Normally you would run some safety functions on these $_POST variables like mysql_real_escape_string() etc, but in this case WordPress does this automatically. Once I have these values I set them as the Akismet equivalent values:</p>
<p>		$name=$_POST['entry_name'];<br />
[sourcecode language="php"]		$email=$_POST['entry_email'];<br />
		$url=$_POST['entry_url'];<br />
		$description=$_POST['entry_description'];</p>
<p>		$akismet->setCommentAuthor($name);<br />
		$akismet->setCommentAuthorEmail($email);<br />
		$akismet->setCommentAuthorURL($url);<br />
		$akismet->setCommentContent($description);[/sourcecode]</p>
<p>Finally all I need to do is run the values through Akismet and check if they are seen as spam or not. I&#8217;ve excluded some unrelevant code here but basically if it&#8217;s spam we put it in the pending links section for someone to check or delete and if it passes OK we add it straight away:</p>
<p>[sourcecode language="php"]		if($akismet->isCommentSpam()){<br />
			echo &#8216;Thanks for adding your site, it will be checked by an admin soon to make sure it is appropriate.&#8217;;<br />
		}else{<br />
			echo &#8216;Thanks for adding your site. Your link has been added!&#8217;;<br />
		}<br />
	}<br />
}[/sourcecode]</p>
<p>This can be done with virtually any content handled by your plugin or script and Akismet is very good at handling huge amounts of data, so you don&#8217;t need to worry. If your script allowed the user to send text messages for example, you would use the text message itself in setCommentContent(); and set the name and email while not setting the setCommentAuthorURL(); at all.</p>
<p>The only thing you need to use Akismet in your own program is an API. You can get one by signing up for WordPress.com (it will be emailed to you). <a href="http://wordpress.com/api-keys/">This page</a> has more information.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.seanbluestone.com/how-to-use-akismet-in-your-own-plugins-and-applications/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Find the pagerank of any page, site or URL using PHP</title>
		<link>http://www.seanbluestone.com/find-the-pagerank-of-any-page-site-or-url-using-php</link>
		<comments>http://www.seanbluestone.com/find-the-pagerank-of-any-page-site-or-url-using-php#comments</comments>
		<pubDate>Wed, 29 Oct 2008 00:24:26 +0000</pubDate>
		<dc:creator>Sean</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.seanbluestone.com/?p=476</guid>
		<description><![CDATA[This is a set of simple functions to find the Google pagerank of any page or site. It basically pretends to be a web browser using the Google toolbar which displays the pagerank to the user. function StrToNum($Str, $Check, $Magic){ $Int32Unit = 4294967296; // 2^32 $length = strlen($Str); for ($i = 0; $i < $length; [...]]]></description>
			<content:encoded><![CDATA[<p>This is a set of simple functions to find the Google pagerank of any page or site. It basically pretends to be a web browser using the Google toolbar which displays the pagerank to the user.</p>
<p><code><br />
function StrToNum($Str, $Check, $Magic){<br />
	$Int32Unit = 4294967296; // 2^32</p>
<p>	$length = strlen($Str);<br />
	for ($i = 0; $i < $length; $i++) {<br />
		$Check *= $Magic;<br />
		// If the float is beyond the boundaries of integer (usually +/- 2.15e+9 = 2^31),<br />
		// the result of converting to integer is undefined<br />
		// refer to http://www.php.net/manual/en/language.types.integer.php<br />
		if ($Check >= $Int32Unit) {<br />
			$Check = ($Check - $Int32Unit * (int) ($Check / $Int32Unit));<br />
			//if the check less than -2^31<br />
			$Check = ($Check < -2147483648) ? ($Check + $Int32Unit) : $Check;<br />
		}<br />
		$Check += ord($Str{$i});<br />
	}<br />
	return $Check;<br />
}</p>
<p>// Genearate a hash for a url</p>
<p>function HashURL($String){<br />
	$Check1 = StrToNum($String, 0x1505, 0x21);<br />
	$Check2 = StrToNum($String, 0, 0x1003F);</p>
<p>	$Check1>>=2;<br />
	$Check1=(($Check1 >> 4) &#038; 0x3FFFFC0 ) | ($Check1 &#038; 0x3F);<br />
	$Check1=(($Check1 >> 4) &#038; 0x3FFC00 ) | ($Check1 &#038; 0x3FF);<br />
	$Check1=(($Check1 >> 4) &#038; 0x3C000 ) | ($Check1 &#038; 0x3FFF);	</p>
<p>	$T1 = (((($Check1 &#038; 0x3C0) << 4) | ($Check1 &#038; 0x3C)) <<2 ) | ($Check2 &#038; 0xF0F );<br />
	$T2 = (((($Check1 &#038; 0xFFFFC000) << 4) | ($Check1 &#038; 0x3C00)) << 0xA) | ($Check2 &#038; 0xF0F0000 );</p>
<p>	return ($T1 | $T2);<br />
}</p>
<p>// genearate a checksum for the hash string</p>
<p>function CheckHash($Hashnum){<br />
	$CheckByte=0;<br />
	$Flag=0;</p>
<p>	$HashStr=sprintf('%u', $Hashnum);<br />
	$length=strlen($HashStr);</p>
<p>	for($i=$length-1; $i>=0; $i--) {<br />
		$Re=$HashStr{$i};<br />
		if(1===($Flag % 2)){<br />
			$Re+=$Re;<br />
			$Re=(int)($Re/10)+($Re%10);<br />
		}<br />
		$CheckByte+=$Re;<br />
		$Flag++;<br />
	}</p>
<p>	$CheckByte %= 10;<br />
	if (0 !== $CheckByte){<br />
		$CheckByte=10-$CheckByte;<br />
		if (1 === ($Flag % 2) ) {<br />
			if (1 === ($CheckByte % 2)) {<br />
				$CheckByte += 9;<br />
			}<br />
			$CheckByte >>= 1;<br />
		}<br />
	}</p>
<p>	return '7'.$CheckByte.$HashStr;<br />
}</p>
<p>function getpagerank($url){</p>
<p>	$fp = fsockopen("toolbarqueries.google.com", 80, $errno, $errstr, 30);<br />
	if(!$fp){<br />
		echo "$errstr ($errno)<br />\n";<br />
	}else{<br />
		$out="GET /search?client=navclient-auto&#038;ch=".CheckHash(HashURL($url))."&#038;features=Rank&#038;q=info:".$url."&#038;num=100&#038;filter=0 HTTP/1.1\r\n";<br />
		$out.="Host: toolbarqueries.google.com\r\n";<br />
		$out.="User-Agent: Mozilla/4.0 (compatible; GoogleToolbar 2.0.114-big; Windows XP 5.1)\r\n";<br />
		$out.="Connection: Close\r\n\r\n";</p>
<p>		fwrite($fp, $out);</p>
<p>		while(!feof($fp)){<br />
			$data=fgets($fp, 128);<br />
			$pos=strpos($data, "Rank_");<br />
			if($pos===false){} else{<br />
				$pagerank = substr($data, $pos + 9);<br />
				return $pagerank;<br />
			}<br />
		}<br />
		fclose($fp);<br />
	}<br />
}<br />
</code></p>
<p>You can make calls to it like this:</p>
<p><code><br />
getpagerank('http://www.google.com');<br />
</code></p>
<p>You can also use this stylesheet which excludes the need for pagerank image icons (though you could use image files if you wished):</p>
<p><code><br />
&#60;STYLE&#62;<br />
	div.pr {<br />
		font-size: 6pt;<br />
		color: #000000;<br />
		float: left;<br />
		height: 30px;<br />
		margin-right: 5px;<br />
	}<br />
	div.prg {<br />
		width: 40px;<br />
		border: 1px solid #999999;<br />
		height: 3px;<br />
		font-size: 1px;<br />
	}<br />
	div.prb {<br />
		background: #5eaa5e;<br />
		height: 3px;<br />
		font-size: 1px;<br />
	}<br />
	&#60;/STYLE&#62;<br />
</code></p>
<p>To use PHP to display the pagerank of a site you would use:</p>
<p><code><br />
$url='http://www.seanbluestone.com';<br />
$Pagerank=getpagerank('http://www.seanbluestone.com');<br />
$Width=$PR*4;<br />
echo '&#60;div class="pr"&#62;PR: '.$Pagerank.'&#60;div class="prg"&#62;&#60;div class="prb" style="width: '.$Width.'px"&#62;&#60;/div&#62;&#60;/div&#62; '.$url;<br />
</code></p>
<p>This would display the pagerank of the page like this:</p>
<div class="pr">PR: 3
<div class="prg">
<div class="prb" style="width: 12px"></div>
</div>
</div>
<p> SeanBluestone.com</p>
<p>One thing to note is that if you make too many calls to this within a short period of time from the same domain it will block you, so if you&#8217;re using it for a link directory or something like that make sure it caches.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.seanbluestone.com/find-the-pagerank-of-any-page-site-or-url-using-php/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

