zoukankan      html  css  js  c++  java
  • .保护Express应用程序

    毫无疑问,Node.js已经变的愈加成熟,尽管这样,开发者仍然缺乏大量的安全指南。在这篇文章中,我将分享一些有关Node.js安全要点给大家,希望大家能够谨记于心。

    1.避免使用Eval

    Eval并不是唯一一个需要避免的函数,在后台,下面这几个表达式可以使用eval:

    setInterval(String, 2)
    setTimeout(String, 2)
    new Function(String)

    为什么要禁止使用eval?因为它

    会打开代码引起注入攻击,并且降低运行速度。

    2.请用严苛模式(Strict mode)

    这种情况下,你可以使用一个受限制的javascript变量,它可以消除一些隐性错误并且会把这些错误抛出去。

    3.Undeletable属性

    'use strict'; 
    delete Object.prototype; // TypeError 
    4.对象声明必须是独一无二的
    'use strict'; 
    var obj = { 
    a: 1, 
    a: 2 
    }; 
    // syntax error 
    5.Prohibits with
    var obj = { x: 17 }; 
    with (obj) // !!! syntax error 


    获得这些隐性错误的完整列表,你可以访问MDN。

    6.测试

    不用说,测试,测试,多点测试~

    当然,不仅仅是单元测试,直戳测试金字塔。

    7.对sudo node app.js说再见

    我看到很多人在运行拥有超级用户权限的Node APP,为什么?因为他们想让应用程序能够监听80或443端口。

    这种做法是错误的。小心一个错误/bug进程就能降低整个系统,因为它已经拥有合法的凭证去做任何事情。

    取而代之,你应该设置一个HTTP服务器/代理来转换请求,可以是nginx、Apache等等。

    8.避免命令注入

    看看下面这段代码有什么问题?

    child_process.exec('ls', function (err, data) { 
    console.log(data); 
    }); 

    child_process.exec调用去执行/bin/sh,所以,这是一个bash注射器,而不是一个程序启动器。

    当用户输入的内容传递到这个方法中,就会产生问题——要么是一个要么就是$(),攻击者很可能会注入一个新的命令。

    开发人员可以使用child_process.execFile来解决此类问题。访问LiftSecurity来查看如何处理命令注入。

    9.临时文件

    开发人员在创建文件时要特别注意,例如处理上传文件。这些文件很容易吃掉你所有的磁盘空间。

    解决方法是使用Streams。

    10.确保Web应用程序安全

    这里不仅仅是针对Node——而是关于如何确保你的Web应用程序安全。

    11.跨站脚本反射

    当攻击者把代码注入到HTTP响应时,这种情况才会发生。应用程序在返回无效的输入到客户端时(大多数都是基于JavaScript编写的),应用程序很容易遭受这种类型攻击。攻击者可以盗取cookies、执行剪贴板和修改页面本身。

    具体示例:

    <a href="http://example.com/index.php?user=
    <script">http://example.com/index.php?user=<script</a>>alert(2881064151)</script> 

    如果用户查询字符串在没有验证的情况下被发送回客户端,并且插入到DOM中,它便会执行。

    如何预防:

    禁止插入不可信的数据到DOM中; 在插入前进行HTML escape。

    点击链接可以查看更多关于跨站脚本反射和解决之道。

    12.停止Cookie盗窃

    默认情况下,在同一个域里,JavaScript可以读取cookies,在跨站脚本攻击里,这是非常危险的。不仅如此,任何第三方JavaScript库都可以读取它们。

    var cookies = document.cookie.split('; ');

    如何预防:

    开发者可以在cookies里面设置httponly标记,这样,JavaScript便无法接近cookie了。

    13.内容安全策略(CSP)

    CSP(Content Security Policy)是一个额外添加的安全层,它有助于检测和减轻某些类型的攻击,包括跨站脚本(XSS)和数据注入攻击。

    通过HTTP header中的Content-Security-Policy方法来启动CSP。

    示例

    Content-Security-Policy: default-src 'self' *.mydomain.com

    这样便会允许内容来自可信域或子域。

    点击查看更多有关CSP示例。

    14.跨站请求伪造(CSRF)

    CSRF(Cross-Site Request Forgery)是一种挟制终端用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

    示例:

    <body onload="document.forms[0].submit()"> 
    <form method="POST" action="http://yoursite.com/user/delete"> 
    <input type="hidden" name="id" value="123555."> 
    </form> 
    </body> 

    执行上面这段代码的后果就是轻易删除用户配置文件。

    如何预防:

    要想阻止CSRF,你应该实现同步令牌模式(Synchronizer Token Pattern),幸运的是,Node社区已经帮你完成了这件事。长话短说,一起来看看它的工作原理:

    当一个GET请求被服务检查为CSRF令牌——如果不存在,就创建一个; 当用户输入显示时,确保要添加一个隐形的CSRF令牌值; 当发送表单时,确保值是来自表单并且要与session相匹配。

    行动

    开发者应该有所行动,制作一个Security Adventure车间来指导现实应用开发。

    15.保护Express应用程序:Helmet

    Helmet是一系列帮助增强Node之Express/Connect等Javascript Web应用安全的中间件。安全功能包括:

    csp
    crossdomain
    xframe
    xssfilter
    等等

    16.使用工具

    npm shrinkwrap:该命令可以给一个包的所有依赖关系上锁,并且创建一个npm-shrinkwrap.json文件。更多详情可以访问NPM。 retire.js:retire.js是一个命令行扫描器,帮助你找到你应用中依赖库存在的漏洞。

  • 相关阅读:
    Android 主题theme说明 摘记
    Android开发 去掉标题栏方法 摘记
    安卓项目五子棋代码详解(二)
    关于 ake sure class name exists, is public, and has an empty constructor that is public
    百度地图3.0实现图文并茂的覆盖物
    android onSaveInstanceState()及其配对方法。
    关于集成科大讯飞语音识别的 一个问题总结
    android 关于 webview 控制其它view的显示 以及更改view数据失败的问题总结
    C# 解析 json Newtonsoft果然强大,代码写的真好
    c#数据类型 与sql的对应关系 以及 取值范围
  • 原文地址:https://www.cnblogs.com/cbryge/p/6217847.html
Copyright © 2011-2022 走看看