网站常见的攻击手段

今天看了淘宝网的前端工程师明城的PDF文档“前端安全概览及防范”,那个PDF文档写得非常好,值得一读,确实也有所收获。

同时文档写得也很轻松幽默,让人看了非常的愉悦。

这里所说的攻击不包括对服务器层面的攻击,如
DDOS攻击,主要是网站层面的攻击。

1.XSS攻击
跨站脚本攻击(Cross-site scripting,通常简称为
XSS)是一种网站应用的安全漏洞攻击,允许恶意使用者将程式码注入到网页上,其他使用者在观看网页时就会受到影响。

XSS 的危害
• 盗取用户Cookie
• 修改页面DOM
• 作为其他攻击的跳板

如何防范 XSS
• Filter input,Escape output(过滤输入,转义输出)
•  严格控制 Cookie域
•  禁用客户端脚本 noscript?

关于XSS,我以前简单的
写过一篇文章

2.CSRF攻击
CSRF(Cross Site Request Forgery)是伪造客户端请求的一种攻击,字面上的意思是跨站点伪造请求。

CSRF 的危害
借用被攻击者在目标站点上的权限,进行不被期望的操作。

那么,如何防范 CSRF
• 正确使用 GET、POST 和 Cookie
• 使用 Referer 判断请求来源
• 在请求中使用 Token
•不要打开陌生的链接

其实
康盛公司的产品在这方面做得非常不错,比如Discuz!论坛的文件upload/include/global.func.php中有如下的一个函数,对于CSRF方面的攻击校验得非常详细,非常值得学习 赞

其实大家应该都知道Referer是可以伪造的,此时必须加上其它的验证条件,比如验证码,比如form提交时加上类似Discuz!中的formhash,比如淘宝中的加入token等等。
function submitcheck($var, $allowget = 0, $seccodecheck = 0, $secqaacheck = 0) {
    if(empty($GLOBALS[$var])) {
        return FALSE;
    } else {
        global $_SERVER, $seclevel, $seccode, $seccodedata, $seccodeverify, $secanswer, $_DCACHE, $_DCOOKIE, $timestamp, $discuz_uid;
        if($allowget || ($_SERVER['REQUEST_METHOD'] == 'POST' && $GLOBALS['formhash'] == formhash() && empty($_SERVER['HTTP_X_FLASH_VERSION']) && (empty($_SERVER['HTTP_REFERER']) ||
            preg_replace("/https?:\/\/([^\:\/]+).*/i", "\\1", $_SERVER['HTTP_REFERER']) == preg_replace("/([^\:]+).*/", "\\1", $_SERVER['HTTP_HOST'])))) {
                if($seccodecheck) {
                    if(!$seclevel) {
                        $key = $seccodedata['type'] != 3 ? '' : $_DCACHE['settings']['authkey'].date('Ymd');
                        list($seccode, $expiration, $seccodeuid) = explode("\t", authcode($_DCOOKIE['secc'], 'DECODE', $key));
                        if($seccodeuid != $discuz_uid || $timestamp - $expiration > 600) {
                            showmessage('submit_seccode_invalid');
                        }
                        dsetcookie('secc', '');
                    } else {
                        $tmp = substr($seccode, 0, 1);
                    }
                    seccodeconvert($seccode);
                    if(strtoupper($seccodeverify) != $seccode) {
                        showmessage('submit_seccode_invalid');
                    }
                $seclevel && $seccode = random(6, 1) + $tmp * 1000000;
                }
            if($secqaacheck) {
                    if(!$seclevel) {
                        list($seccode, $expiration, $seccodeuid) = explode("\t", authcode($_DCOOKIE['secq'], 'DECODE'));
                        if($seccodeuid != $discuz_uid || $timestamp - $expiration > 600) {
                            showmessage('submit_secqaa_invalid');
                        }
                        dsetcookie('secq', '');
                    }
                    require_once DISCUZ_ROOT.'./forumdata/cache/cache_secqaa.php';
                    if(md5($secanswer) != $_DCACHE['secqaa'][substr($seccode, 0, 1)]['answer']) {
                            showmessage('submit_secqaa_invalid');
                    }
                $seclevel && $seccode = random(1, 1) * 1000000 + substr($seccode, -6);
                }
            return TRUE;
        } else {
            showmessage('submit_invalid');
        }
    }
}

3.Clickjacking
配合用户无意识的交互行为进行的攻击

总的来说,当你访问一个恶意网站的时候,攻击者可以控制你的浏览器对一些链接的访问,这个漏洞影响到几乎所有浏览器,除非你使用 lynx 一类的字符浏览器。这个漏洞与 JavaScript 无关,即使你关闭浏览器的 JavaScript 功能也无能为力。事实上这是浏览器工作原理中的一个缺陷,无法通过简单的补丁解决。一个恶意网站能让你在毫不知情的情况下点击任意链接,任意按纽或网站上任意东西。
更多关于Clickjacking攻击的内容可以看
这儿

4.总结
一般的小公司可能对网站的安全方面的问题重视程度不足,一般是发现了问题再去改进,同时也跟公司的业务有关,如果是电子商务网站或支付网站或是商业网站对安全方面的要求就比较高了,提前考虑这些问题也是非常有必要的,未雨绸缪嘛。



上一篇: PHP关于URL参数传递的问题
下一篇: PHP中的全局变量的一些小结
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
相关日志:
评论: 0 | 引用: 0 | 查看次数: 1634
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持Gravatar头像,邮箱地址不会公开.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭

 广告位

↑返回顶部↑