XSS(Cross Site Script,跨站脚本攻击)
XSS(Cross Site Script,跨站脚本攻击)是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式。
攻击形式有两种:
反射型攻击(就是到处发小黄网链接用户点击了以后通过脚本窃取你的数据,所以年轻人悠着点)、
持久型攻击(这就是把脚本存入low的网站的数据库取出来就会成为攻击脚本)。
解决方法:消毒(对危险字符进行转义)和HttpOnly(防范XSS攻击者窃取Cookie数据)
攻击示例代码:
消毒:
/** * @name Escape(编码特殊字符) * @remark 编码特殊字符 * @exp Escape("a'b") * @param $Data string 需要处理的字符串 * @param $Filter string 是否过来敏感词语 * @author Soul * @copyright 2013-3-18 * @return 编码后的字符串 */ function Escape($Data, $Filter = false) { if($Filter) { //Filter.php文件内容是 return array('***','***') $FilterArr = include('lib/Filter.php'); $Data = str_replace($FilterArr, '***', $Data); } $TrimHtmlTag = 'script|i?frame|style|html|body|title|link|meta'; $FindArr = array( sprintf("/<(%s)([^>]*?)>/isU", $TrimHtmlTag), sprintf("/</(%s)>/isU", $TrimHtmlTag) ); $ToArr = array('<$1$2>', '</$1>'); $Data = preg_replace($FindArr, $ToArr, $Data); $ReplaceArr = array('\'=>'\\', "'"=>"''"); return trim(strtr($Data, $ReplaceArr)); } // 嵌入的攻击脚本 echo '<script>alert(123);</script>'; echo '<title>我是来攻击你的,我要把你的标题改掉</title>'; echo '<meta name="我是假的关键词迷惑百度爬虫" content="我是伪造的内容描述">';
用户发了一个帖子,里面藏了
<script>alert(123);</script>、
<title>我是来攻击你的,把你的标题改掉咯!</title>、
<meta name="我是假的关键词迷惑百度爬虫" content="我是伪造的内容描述">这样的字符,那么你直接输出可是会导致普通用户打开的页面出现了标签栏标题被改、关键词被改、alert弹框的情况。
如果你用Escape处理过后,这些字符会被转为HTML实体,
浏览器拿到的内容是实体并不会执行不会alert之类的操作,而普通用户也可以看到<script>这样的脚本,
查看浏览器源代码你就可以看到<script>alert(123);</script>这样的字符。
朋友们就会问了,为什么我不用自带函数htmlentities也可以转HTML实体啊,我用strip_tags也可以自动剥除字符串之中的HTML标签达到防止脚本攻击的作用啊。
需要用你这个函数干嘛,好好好,你们说的都对,但是有些HTML标签我是要的,你把它给我弄掉干嘛比如加粗、斜行显示、这些人畜无害的也被你干掉了不好吧
同样的效果可以用PHP自带的函数htmlentities(转换HTML标签为实体)、函数strip_tags(剥除字符串中的HTML标签)
被误伤的友军:
echo Escape('<b>hello,我是需要被加粗的文本。</b>');//b标签未被输出并且有加粗效果 echo htmlentities('<b>hello,我是需要被加粗的文本。</b>');//无加粗效果<b>标签也当成文本输出了
HttpOnly(防范XSS攻击者窃取Cookie数据):
什么是httponly呢?就是设置了它,JavaScript就不能拿到你的cookie了,无论你的网站有多少脚本拿不到用户的cookie,怎么设置呢?PHP5.2版本以上通过 ini_set("session.cookie_httponly", 1),至于什么PHP 4这些过时的版本通过header函数将就,具体自己百度吧
还有Session Cookie的secure属性设置为1的时候,cookie就只能在https的协议下传输也可以提高安全性
SQL注入攻击:
攻击示例1:
就是用户提交的数据直接被mysql_query作为语句执行,比如
SELECT * FROM url_pic WHERE id=1 AND url=123;truncate table url_pic
这条语句 123;truncate table url_pic
是有心者在输入框有意加上去的,input value ==> 123;truncate table url_pic
// 只是想查看一条记录,输入了数据以后把表都给清空了
怎么解决呢
语句变成:
SELECT * FROM url_pic WHERE id=1 AND url= '123;truncate table url_pic'
就是检验你得数据,在拼接SQL语句的时候,如果非整数就用引号将其作为一个字符串解析
sprintf(" and id= %d and url='%s' ",$_POST['id'],$_POST['url']);
// 此时后面的SQL语句只会被作为一个字符串去匹配
攻击示例 2:
在用户填入名称和密码的时候不进行数据校验而直接post数据拼接入SQL语句之中
SELECT * from user WHERE name = '' or '1'='1' AND password = '' or '1'='1'
这样即使不输入用户名和密码也可以把所有的用户账户信息暴露出来,这是非常危险的
CSRF攻击(Cross Site Request Forgery,跨站请求伪造)
防范CSRF的主要手段是识别请求者的身份,主要有以下几种方式:
(1)在表单中添加令牌(token);
(2)验证码;
(3)检查请求头中的Referer(前面提到防图片盗链接也是用的这种方式)。
参考文章:
简述几种web攻击方法:https://www.cnblogs.com/wade-luffy/p/6074616.html
详细描述跨站脚本攻击:https://www.cnblogs.com/caijh/p/6163334.html