我正在为一组网站设计API.这些站点非常相似(有点像StackOverflow,SuperUser和ServerFault),它们有一个共享的后端是有意义的.因此,我们决定尝试使用一个漂亮的REST API作为后端,以及一堆非常相似但不同的前端消耗所述API.前端应该最好都是静态的,但如果结果是不可能的话,这并不是一个很难的要求.
我现在正在设计该API,我担心安全问题,特别是CSRF.根据我对CSRF攻击的基本了解,它们包含两个重要组成部分:
能够命名资源和请求正文.
欺骗用户/浏览器使用环境身份验证(如会话)向看起来经过身份验证的资源发出请求.
许多修复CSRF攻击的经典方法都是基于会话.由于我的REST API并不真正进行会话,这既可以防止很多向量,也可以防止所有修复它们的方法.例如,双重提交没有意义,因为没有什么可以双重提交.
我最初的方法涉及攻击CSRF攻击的第2部分.如果我验证所有请求(例如使用HTTP Basic Auth),并且浏览器没有保存这些凭证(例如某些JS发出请求),只有拥有凭据的JS可以发出请求,我们就完成了.明显的缺点是应用程序需要知道用户的凭据.另一个稍微不那么明显的缺点是,如果我想在API端安全地存储凭证,那么验证密码应该花费一个固定的,非平凡的时间.如果安全地验证密码需要100毫秒,那么每个其他请求将花费至少100毫秒+ eps,并且它将需要一些非常聪明的客户端技巧来使这感觉不慢.我可能能够缓存它(因为凭证将始终是相同的),如果我非常小心,我可能设法做到这一点,而不会引入时间漏洞,但这听起来像一个大黄蜂的巢.
OAuth 2.0似乎有点过头了,但我想它毕竟可能是最好的解决方案,以免我最终执行得不好.我想我现在可以做HTTP Basic Auth的事情,当我们有第三方应用程序开发人员时,我会转到OAuth.
与OAuth有一点阻抗不匹配.OAuth真的想帮助应用程序访问另一个应用程序上的东西,基本上.我希望用户在这样的帐户存在之前注册其中一个前端.
我还考虑通过使URL随机化来攻击点1 - 即将标记添加到查询字符串中.这肯定会起作用,并且它非常接近于表单中传统的随机令牌如何工作,并且鉴于HATEOAS它甚至应该相当RESTful,尽管这提出了两个问题:1)你从哪里开始?是否存在使用HTTP Basic Auth登录的强制API起点?2)如果他们无法预先预测URL,那么它会让应用程序开发人员满意多少,HATEOAS会被诅咒?
我已经看到如何在RESTful应用程序中阻止CSRF?,但我不同意随机URI必然是不可靠的前提.此外,这个问题并没有真正令人满意的答案,也没有提到OAuth.此外,会话双提交解决方案无效,正如我上面提到的(静态前端的不同域比API端点).
我意识到我从根本上试图在这里做的是尝试允许来自一个域的跨站点请求而不允许它们从另一个域中进行,这并不容易.当然必须有一些合理的解决方案吗?
我们有几个内部库,我们已经拆分(出于几个原因,主要是管理或有可能在以后轻松开源).如果重要的话,他们住在私人Github存储库中.
我想将一个应用程序部署到Heroku来试用它.这取决于其中一个库.
我应该在requirements.txt中指定我的依赖项.对于PyPI可安装的东西来说这很容易,但我该如何处理这些内部依赖?
我可以运行我自己的具有这些东西的私有PyPI镜像,或者我可以使用可编辑的包(即使文档说它们不应该用于生产).
这样做的适当方法是什么?
假设我有像Bootstrap这样的外部依赖.我想从那里导入一些LESS,因为这样我可以在我的代码中使用Bootstrap mixins.
由于Meteor已经在我的树中编译和连接所有LESS(对吗?),只需复制LESS目录然后手动更新它一次不是解决方案.实际上,使用默认的LESS目录,似乎每个LESS源文件将在输出中出现两次:一次因为它是导入的bootstrap.less
,一次是因为文件本身.
有没有办法让流星忽略一些路径?public/
听起来很近; 但我真的不想服务于bootstrap repo.
另外,这可能会为LESS修复它,但是在bootstrap中处理JS扩展的适当方法是什么?
我正在为执行加密操作的JVM(在Clojure中)编写软件.具体地,给定秘密输入,秘密密钥,非秘密盐,非秘密个性化,它使用BLAKE2来导出512位密钥材料.然后使用Arrays
该类中的工具将该阵列切换为两个256位块.(来源)
该操作的实际实现住在libsodium所以它用C实现我用铯来访问它,这是在包装钾,使用图书馆JNR-FFI调用底层的C实现.
由于上面的所有缓冲区都有敏感的密钥材料,我想确保它从内存中清除.我不确定如何在JVM上安全地做到这一点(哎呀,我甚至不知道如何在C中安全地做到这一点).鉴于材料从C转换const char *
为JVM byte[]
,然后我的一些操作生成新的JVM字节数组,密钥材料将存在于JVM字节数组中.这引起了两个问题:
byte[]
,之后没有被任何代码触及,我怎么能确定它byte[]
实际上被清零了?我假设JVM可以自由地优化它.byte[]
被零,我怎么知道JVM还没有决定到阵列复制(如垃圾回收器的情况下)很多次,不归零原来的位置,因此留下键控无论如何,虚拟内存的材料?我猜测答案将最终成为"在C&ASM中做到"或者甚至"在HSM中做",但我很想知道是否有JVM-land方法来解决这个问题.