数据安全是软件设计中要考虑的问题,在程序中保持数据的安全,除了保证代码内部运行的可靠,最主要就是严格控制外部数据,秉持一切用户输入的都是不可靠的原则,做好数据的验证和过滤.
PHP最简单的过滤机制就是转义,对用户的输入和输出进行转义和过滤.
我们先搞一个例子:
下面是一个很简单的表单
<form action="" method="post">
留言:<textarea name="content" rows="20" cols="40"></textarea>
<input type="submit" value="提交">
</form>
<?php
echo $_POST['content'];
?>
在文本区域内输入
<style>body{background:#000}</style>
点击提交,会发现浏览器除了输入框外都变成黑色的.查看页面源代码,会发现是因为原样地输出了css代码.这其实就是XSS攻击
XSS攻击百度百科:
XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中
XSS攻击当然不是我们这里所写的添加CSS样式代码这么低端.它可以做到很多危害
1、盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
2、控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
3、盗窃企业重要的具有商业价值的资料
4、非法转账
5、强制发送电子邮件
6、网站挂马
7、控制受害者机器向其它网站发起攻击
最简单地处理以上的问题,只需要在接受数据处理的时候用上过滤函数htmlspecialchars,这个函数会把代码中的特殊字符转义成HTML实体,输出的时候就不会影响页面了
<?php
echo htmlspecialchars($_POST['content']);
?>
还有一种方法是直接过滤掉html标签,这里要用到正则表达式
<?php
// echo htmlspecialchars($_POST['content']);
$rege = '/<\/?[^>]+>/';
$result = preg_replace($rege,"",$_POST['content']);
echo $result;
?>
PHP提供了一个内置的strip_tags函数可以出去字符串中HTML和PHP标签,仅保留参数中指定的标签
<?php
$str = '<p>Test parjlkasdf </p><a href="#test">Other text</a>';
echo strip_tags($str);
echo "</br>";
echo strip_tags($str,'<p> <a>');//允许p标签和a标签
?>