如何在Node.js中防止跨站脚本
本文将帮助读者了解什么是跨站脚本攻击(XSS),XSS如何工作,以及XSS如何扰乱网站。我们还将介绍如何在Node.js平台上预防这一漏洞。计算机安全在维护和保护存储在网络应用程序中的信息方面起着重要作用。
目前,在通过万维网(WWW)提供服务和信息访问时,网络应用是首选。网络应用程序在互联网上提供了许多服务,如电子商务和网络银行。
尽管为保护网络应用程序作出了努力,但它们仍然遭受着严重的破坏和攻击。这些攻击威胁着网络应用的安全。其中一种攻击被称为跨站脚本(XSS)攻击。
跨站脚本攻击是现代网络安全中常见的安全问题。XSS攻击是由攻击者利用脆弱的网络应用程序来注入恶意代码。
恶意代码在浏览器中执行,攻击者窃取账户用户的cookies,并获得网络应用中的敏感和机密信息。
一旦恶意代码被注入,这可能使网站处于攻击者的控制之下。对于这些攻击,在客户端和服务器端都有解决方案。
前提条件
需要对Node.js和JavaScript有一定的了解,才能轻松跟上。
什么是跨站脚本(XSS)
跨站脚本(XSS)是一种针对网络应用的代码注入攻击。攻击者利用有漏洞的网站来注入恶意代码或脚本。XSS允许攻击者使用JavaScript等脚本语言注入恶意代码。
恶意代码会在用户的浏览器上执行。然后,攻击者可以访问浏览器保存的cookies、密码和其他机密信息。
如果用户输入的信息没有经过适当的编码,网络应用就容易受到XSS的攻击。当用户输入的编码不正确时,恶意脚本就会被发送给用户并执行。
不正确的输入验证和对网络应用程序用户提供的数据进行消毒是导致XSS攻击的主要原因。
XSS是如何工作的
XSS的工作原理是利用一个有漏洞的网络应用程序。攻击者向用户发送恶意代码并被执行。当恶意脚本执行时,攻击者可以与应用程序互动。
为了防止XSS,开发人员必须知道XSS是如何工作的。让我们通过这个场景来了解XSS的工作原理。
XYZ是一个电子商务网站,向客户销售物品。项目的数据被发送到服务器并存储在数据库中。如果一个人需要购买物品,必须创建一个账户,并得到验证,成为网站的合法用户。一个用户登录到网站。在获得访问权之前,系统必须验证试图登录的人是否是网站的合法用户。
在另一边,攻击者创建一个超链接并输入JavaScript代码。该代码将读取访问该网页的用户的cookie。该脚本被发送、处理并存储在数据库中。
网络用户(受害者)通过点击链接在其浏览器上执行该代码。恶意代码读取他的cookie并将其发送到攻击者的网络服务器。
攻击者利用脆弱的网络应用程序向网络用户传播攻击。攻击者还可以修改受影响的网站,从用户账户中窃取用户名和密码。由于cookies存储了用户的会话,攻击者会收到用户的数字身份。攻击者将用户的cookie加载到其浏览器中,冒充用户进入网络应用。
攻击者可以看到和做所有用户有权看到和做的事情,而用户的会话也是如此。用户的cookie被传递到服务器上并被验证。鉴于cookie包含用户的当前会话,服务器认为该请求来自合法用户。
在这段时间里,用户并不知道有攻击正在发生。这就是XSS攻击的工作方式。
跨站脚本漏洞是。
- 容易发现。
- 容易使用。
- 对你的商业安全有很大影响。
XSS攻击的类型
以下是不同类型的XSS攻击。
反射式跨站脚本
反射式XSS(非持久性XSS)是一种攻击,当恶意脚本通过HTTP重定向到一个应用程序时发生。在非持久性XSS中,恶意代码会在受害者的浏览器中即时执行。
如果服务器未能对用户输入进行正确编码,攻击者可能会搜索这样一个字符串<script>alert (‘XSS!')</script> 。这个JavaScript代码作为代码的一部分反映在浏览器上。然后,该代码被执行,显示一个确认XSS漏洞的警报。下面是一个反射式XSS攻击的例子。
恶意代码注入前的HTTP链接
https://example-webapp.com/report =Safe
攻击是如何进行的。
https://example-webapp.com/report =<script>\/*Not+Safe…?+*/</script>
当用户访问攻击者发送的URL时,恶意脚本立即在浏览器中执行。
存储的跨站脚本
存储的XSS(持久性XSS)发生在恶意脚本被保存在网站的数据库中。当用户访问网络应用时,该恶意脚本就会执行。在受害者打开浏览器的任何时刻,恶意脚本都会运行。
基于DOM的跨站脚本攻击
这是一种对DOM(文档对象模型)的攻击。它产生于用户浏览器中的DOM修改导致的恶意脚本执行。大多数开发人员并不了解[基于DOM的XSS]是如何工作的。
如何防止XSS
XSS是网络应用的主要攻击手段。现在我们对XSS有了更好的了解,知道它是如何破坏应用程序的。我们将讨论以下内容,这些内容是用于[防止]Node.js中的[XSS漏洞的]技术
输出编码
输出编码将不可信任的输入转化为安全模型。它通过在Node.js平台服务器中运行JavaScript实体编码,然后再将不可信任的数据发送到浏览器中。
避免插入不可信任的数据
开发人员必须拒绝插入不可信任的数据以防止XXS。在JavaScript代码中插入不可信任的数据时,应使用JavaScript转义。避免将不可信任的数据传入可执行的JavaScript函数,如eval 。该函数eval 评估或执行一个参数。
Node.jseval 函数启用代码注入。代码注入是一个由处理无效数据引起的安全漏洞。攻击者引入一个恶意代码,在应用程序中执行。
eval 函数接收一个字符串参数,并将其解释为允许攻击者执行的JavaScript代码。下面是一个将不受信任的数据传递给eval 函数的例子,该函数执行一个脚本。
这个简单的例子,当你在某个操作中输入类似alert ('XSS!'); 的代码时,就会执行代码。
function compute() {
var opr1 = $('#operation1').val();
var opr2 = $('#operation2').val();
var answer = eval(opr1 + ' + ' + opr2);
$('#answer').text(answer);
}
在JavaScript代码中插入不可信任的数据的唯一安全方式是在一个带引号的(")数据值内。
比如说。
<script>Alert (“…encode untrusted data before being executed…”)</script>
在脚本里面插入不受信任的数据是很危险的,因为攻击者很容易用(;,=,+,&,<和>)等字符切换到执行环境中。
验证用户输入
为了防止XSS,开发人员必须验证用户输入并对输出进行编码。验证用户输入是在服务器端用于防止XSS攻击的一种防御技术。这意味着XSS缓解措施是在Node.js平台上应用的。
进行输入验证是为了确保只有安全的数据进入信息系统。用户输入的验证应该在收到对方的数据后立即进行。
使用下面的脚本,通过输入验证来防止XSS。
var validator = require('validator');
var escaped_string = validator.escape(string);
在处理攻击者的请求之前验证输入是很重要的,因为它可以在早期防止XSS攻击。输入验证在应用程序执行之前检测未经授权的用户输入。特殊字符如(...和...)应被过滤,以防止它们被恶意使用。
在防止XSS攻击时,进行服务器端的输入验证是至关重要的。服务器端主要是输入验证的首选,因为通过客户端进行验证时,很容易被绕过。
在用服务器端的JavaScript(Node.js)验证用户输入时,可以试试npm模块strip-js 。
它做了以下工作。
- 对数据进行消毒。
- 摒弃脚本标签。
- 删除含有JavaScript代码的属性,即
onclick和onerror。 - 删除含有JavaScript代码的 "href "属性。
对输入进行消毒
输入净化是一种预防XSS的方法,为应用程序用户过滤和清理数据输入。对输入进行消毒可以去除数据中的任何非法值。
正确的净化输入可以确保用户只提交可信的数据。它确保只有预期的数据被输入,即(只授权输入字段接受括号、数字和连字符)。在执行前对HTTP请求中的数据进行消毒,确保数据在输出给用户之前得到验证、转义和过滤。
HttpOnly:防范XSS的cookies
防止XSS的另一个方法是防止浏览器JS脚本访问cookie。盗窃cookie是最常见的XSS攻击之一。它是通过在下面的代码中把cookiehttpOnly 的值设置为true 来实现的。
app.use(express.session({
secret: "k5Zurj4",
cookie: {
httpOnly: true,
secure: true
}
})
)
将cookiehttpOnly 的值设置为true ,有助于防止客户端脚本访问受保护的cookie。HttpOnly 告诉浏览器不要将cookie暴露给脚本。
结论
跨站脚本是网络应用程序面临的主要安全问题。在这篇文章中,我们已经了解了什么是XSS以及它有多危险。我们还学习了如何在服务器端平台(Node.js)上防止它。
总结一下。
- 读者已经了解了什么是跨站脚本。
- XSS如何工作。
- XSS攻击的类型。
- 读者已经学会了如何在node.js平台上防止XSS攻击。
希望这篇文章能帮助你了解XSS以及如何在服务器端平台上预防XSS。