比如我们对字符串"< >"使用htmlentities函数,字符串"< >"将被转化为"&lt; &gt;",将"<"和“>”转换为HTML实体,可以防止浏览器将它们作为HTML元素的一部分被解释或运行(经常使用在用户提交表单数据的时候)。

 

可能上面解释起来比较难得理解,但是如果你能理解浏览器在不同阶段的工作原理,那么就非常简单了。下面让我们来看一下htmlentities在三个不同阶段(php阶段、原始HTML格式阶段和WEB浏览器阶段)字符串是如何改变的。

// An imaginary article submission from a bad user
//  it will redirect anyone to example.com if the code is run in a browser
$userInput = \"I am going to hax0r your site, hahaha!
	<  type=\'text/ \'>
	window.location = \'http://www.example.com/\'
	</ >\'\";
	
//Lets make it safer before we use it
$userInputEntities = htmlentities($userInput);

//Now we can display it
echo $userInputEntities;

上述脚本的HTML输出如下所示

安全原始的HTML代码:(如果你查看HTML源码)

I am going to hax0r your site, hahaha!
	&lt;  type=\'text/ \'&gt;
	window.location = \'http://www.example.com/\'
	&lt;/ &gt;\'

如果我们没有使用htmlentities函数将HTML代码转换成安全的实体,那么原始的HTML代码将运行并跳转到http://www.example.com/页面

 

在什么时候需要使用htmlentities

任何时候,你允许用户提交内容到你的网站,其他游客可以看到,你应该考虑取消让他们使用HTML的能力。虽然这将消除很多很酷的事情,你的用户可以做的,喜欢做大量定制的内容,它会阻止你的网站从大量的普通攻击。随着一些自定义编码你可以从运行删除特定的标签,但这超出了本课的范围。

请记住,这允许用户提交内容到您的网站时,您也给他们访问你的网站。请确保您采取适当的预防措施。

收藏 打印