小编Ita*_*Ale的帖子

Socket.io 1.x:仅使用WebSockets?

我们正在开发一个仅在现代浏览器(IE10 +)上运行的Web应用程序,原因各不相同.

我们实现的功能之一是Socket.io 1.x. 但是,默认情况下,Socket.io客户端会尝试支持较旧的浏览器,因此它会启动与长轮询的连接,然后将其更新到WebSockets.这是浪费时间和资源,因为我们知道浏览器支持WS.

我一直在搜索,我只能找到这个wiki页面,但是,它是关于Socket.io 0.9的.

最后,我找到了engine.io-client的文档(Socket.io-client基于1.x分支).这是我编写的代码,似乎正在运行.但是,我想知道它是否正确或者我做错了什么:

io.connect('https://...', {
    upgrade: false,
    transports: ['websocket']
})
Run Code Online (Sandbox Code Playgroud)

奇怪的是,仅仅将transports属性设置为数组websockets是不够的; 我也不得不禁用upgrade.它是否正确?

更新

我做了一些新的发现.

随着transports设置为['websocket']只,它没有任何区别阉羊upgrade被启用.这是正常的吗?

javascript websocket socket.io

37
推荐指数
4
解决办法
4万
查看次数

来自链接器的奇怪警告(ld)

我们正在构建一个主要使用Obj-C/Cocoa编写的Mac OSX应用程序.然后,应用程序静态链接一些第三方库,用C/C++编写并由我们编译(在命令行上,使用MacPorts或通常的"./configure && make";所有都是通用二进制文件).

该应用程序运行正常,但广告编译时我们总是得到这些奇怪的链接器警告:

ld: warning: direct access in ___cxx_global_var_init17 to global weak symbol __ZGVN4i18n12phonenumbers9SingletonINS0_15PhoneNumberUtilEE8instanceE means the weak symbol cannot be overridden at runtime. This was likely caused by different translation units being compiled with different visibility settings.
ld: warning: direct access in ___cxx_global_var_init17 to global weak symbol __ZGVN4i18n12phonenumbers9SingletonINS0_15PhoneNumberUtilEE8instanceE means the weak symbol cannot be overridden at runtime. This was likely caused by different translation units being compiled with different visibility settings.
ld: warning: direct access in ___cxx_global_var_init17 to …
Run Code Online (Sandbox Code Playgroud)

macos xcode ld

24
推荐指数
3
解决办法
2万
查看次数

移动浏览器检测?

我们正在寻找一种方法来确定用户是否使用移动浏览器.我们需要通过解析用户代理字符串在PHP中执行此操作.我知道这种方法有很多注意事项,但我们确实需要这样做.

你有什么建议吗?一个好的(即使不是完美的)更新代码?

我知道WURFL,我相信它很棒,但它不能免费用于非开源项目.通过谷歌搜索,我也发现了这个代码:http://mobiforge.com/developing/story/lightweight-device-detection-php(以及一些变体),但我不确定.看起来它写得非常糟糕(例如,看看,当他们使用$ mobile_browser ='0'时,引号围绕整数...).

你能推荐什么吗?

谢谢,

亚历山德罗

php mobile user-agent browser-detection

17
推荐指数
2
解决办法
2万
查看次数

Node.js/Express和并行队列

我们正在构建一个具有Node.js服务器和Express的基础架构.

在服务器中,发生的事情如下:

  1. 服务器接受来自客户端的传入HTTP请求.
  2. 服务器生成两个文件(此操作可以"相对较长",也意味着0.1秒左右)
  3. 服务器将生成的文件(每个约20-200 KB)上载到外部CDN
  4. 服务器响应客户端,这包括CDN上文件的URI

目前,服务器按顺序为每个请求执行此操作,这非常有效(Node/Express可以自动处理并发请求).但是,随着我们计划增长,并发请求的数量可能会增加,我们认为实现队列处理请求会更好.否则,我们可能会面临同时运行太多任务以及与CDN打开过多连接的风险.快速响应客户并不是一件相关的事情.

我在想的是在节点服务器中有一个单独的部分,其中包含一些 "工作者"(2-3,但我们将进行测试以确定正确的同时操作数).所以,新流程看起来像:

  1. 在接受来自客户端的请求之后,服务器将操作添加到队列.
  2. 有2-3个(待测试的)工作人员将元素从队列中取出并执行所有操作(生成文件并将其上载到CDN).
  3. 当工作人员处理了操作(如果它在队列中停留相对较长时间无关紧要),它会通知节点服务器(回调),服务器响应客户端(同时等待客户端) ).

您如何看待这种方法?你认为这是正确的吗?

最重要的是,如何在Node/Express中实现?

感谢您的时间

queue concurrency node.js express

15
推荐指数
2
解决办法
1万
查看次数

实时统计:MySQL(/ Drizzle)还是MongoDB?

我们正在开发一个项目,该项目将包含某些操作(例如点击次数)的实时统计信息.每次点击,我们都会记录日期,年龄和性别(这些来自Facebook),位置等信息.

我们正在讨论存储这些信息的最佳位置,并将它们用于实时统计.我们将显示汇总统计信息:例如,点击次数,男性/女性点击次数,点击次数除以年龄组(例如18-24岁,24-30岁......).

由于我们在网站上使用的是MongoDB,我的同事认为我们也应该在其中存储统计信息.但是,我更喜欢基于SQL的数据库来完成这项任务,比如MySQL(或者可能是Drizzle),因为我认为在进行数据聚合等操作时,SQL会更好.虽然解析SQL的开销很大,但我认为MySQL/Drizzle实际上可能比No-SQL数据库更快.使用INSERT DELAYED查询时插入也不慢.

请注意,我们不需要执行JOINS或从多个表/集合中收集数据.因此,我们不关心数据库是否不同.但是,我们关心可扩展性和可靠性.我们正在构建一些(希望)变得非常大的东西,并且我们在设计每一行代码时都考虑了可伸缩性.

你怎么看待这件事?有没有理由比MySQL/Drizzle更喜欢MongoDB呢?还是无动于衷?如果你是我们,你会使用哪一个?

谢谢,亚历山德罗

mysql statistics mongodb drizzle

14
推荐指数
1
解决办法
6385
查看次数

全文搜索加密数据

假设我有一个存储加密文本的服务器(端到端:服务器永远不会看到纯文本).

我希望能够对该文本进行全文搜索.
我知道这很棘手,但我的想法是使用传统的全文设计("列表"和"匹配"表,其中单词存储并与内容表中的ID匹配).当用户提交加密文本时,他们还会发送单词和相应匹配的盐渍MD5.使用的盐对每个用户都是唯一的,并从密码中恢复.
(简而言之:唯一的区别是"list"表将包含散列词)

现在,这个系统有多脆弱
请注意,我说"多么脆弱"而不是"多么安全",因为我承认它不是完全安全的.
我理解功能(全文搜索)和安全性(从单词索引中披露一些信息)之间的权衡.例如,据我所知,能够获取列表和匹配表的攻击者可以获得有关原始加密文本的信息,并且可能能够通过统计分析来解读某些单词(但是,对于每个用户来说,这是唯一的盐,这将需要为每个用户重复).

这种威胁有多严重?还会有其他严重的威胁吗?

免责声明
我正在努力建立(并在密码学家的帮助下进行实际实施;现在我只是想了解这是否可行)是一种消费级产品,它将处理机密而不是完全保密数据.
我的目标只是提供足够安全的东西,以便攻击者更容易尝试窃取用户的密码(例如,破坏客户端 - 他们最终是消费者),而不是花费大量时间和计算能力尝试蛮力指数或运行复杂的统计分析.

回应@Matthew的评论

(可能与其他人回答相关)

  1. 如您所述,其他解决方案并不可行.将所有数据存储在客户端内意味着用户无法从其他客户端访问其数据.服务器端加密可以工作,但是我们将无法为用户提供额外的客户端加密安全性.
    唯一的"真正替代方案"就是不实现搜索:虽然这不是必需的功能,但对我/我们来说非常重要.

  2. 盐将以与用户的解密密钥(用于解密存储的文本的密钥)完全相同的方式受到保护.因此,如果有人能够捕获盐,他或她可能也能够捕获关键,从而产生更大的问题.
    确切地说,密钥和盐将以加密方式存储在服务器上.它们将由客户端使用用户的密码在本地解密并保存在内存中; 服务器永远不会看到解密的密钥和盐.用户可以更改密码,然后他们只需要重新加密密钥和盐,而不是所有存储的文本.据我所知,这是业界非常标准的方法.

  3. 实际上,数据库的设计如下(仅报告相关条目).这个设计就像你在评论中提出的那样.它不允许接近搜索(与我们不太相关)并且使频率不准确.

    • content,包含所有加密文本.列是content.idcontent.text.
    • words,包含所有哈希的列表.列是words.idwords.hash.
    • match,匹配带有哈希/单词的文本(以一对多的关系).列是match.content_idmatch.word_id.
  4. 我们必须实现删除停用词等功能.当然.这不是一个大问题(当然,将在客户端完成).最终,这些列表对于国际(即非英语用户)用户来说一直有限.
    我们希望查找/插入比率非常高(即很多查找,但很少有插入,主要是批量).

  5. 解密整个哈希数据库肯定是可能的,但需要强力攻击.
    假设盐是安全的(按照上面的第2点).如果盐足够长(你引用32位......但为什么不是320? - 只是一个例子)需要花费很多时间.

总结......你证实了我对频率分析可能存在风险的疑虑.但是,我觉得这种风险并不是那么高.你能证实吗?
实际上,首先,每个用户的盐都是唯一的.这意味着一个用户必须及时受到攻击.
其次,通过每个文本仅报告一次单词(无论它们出现多少次),频率分析变得不太可靠.
第三......例如,散列词的频率分析听起来不像凯撒移位的频率分析那么好.仅英语就有250,000个单词(并且,并非所有用户都会说英语),即使某些单词比其他单词更常见,我相信无论如何都很难做到这种攻击.

PS:我们要存储的数据是消息,如即时消息.这些都很简短,包含很多缩写,俚语等.每个人在撰写文本时都有不同的风格,进一步降低了频率攻击的风险(在我看来).

security encryption cryptography

13
推荐指数
1
解决办法
7095
查看次数

从模数和指数创建rsa公钥

我想验证RSA签名.我有数据来验证,签名和公钥以模数和指数的形式.我想使用openssl进行验证.可能吗?我知道我可以使用,openssl rsautl -verify -in sig -inkey key.pem但我不知道如何(使用openssl)创建一个只有它的模数和指数的公钥.

也许其他想法如何检查这个签名(除了写一些程序)?

openssl rsa

12
推荐指数
2
解决办法
8657
查看次数

我应该如何存储RESTful API生成的令牌?

我已经构建了一个API,为登录的用户生成一个身份验证令牌.此时我还有一个用Node.JS编写的客户端应用程序.
当我使用客户端应用程序的用户凭据向API发出请求时,我获得了身份验证令牌:我应该如何将其存储在客户端应用程序中?每次我想要请求API时,我都不应该请求令牌,对吗?
我想过将令牌放在Cookie中,但我不认为这是最好的解决方案.你会推荐什么?

authentication api rest token node.js

12
推荐指数
1
解决办法
8558
查看次数

为什么promise.join()将函数作为其最后一个参数?

假设我在需要检索两个对象的过程中有一个步骤.我会join()用来协调检索:

return promise.join(retrieveA(), retrieveB())
           .spread(function(A, B) {
               // create something out of A and B
           });
Run Code Online (Sandbox Code Playgroud)

文档显示您还可以将处理程序作为最后一个参数传递:

return promise.join(retrieveA(), retrieveB(), function(A, B) {
           // create something out of A and B
       });
Run Code Online (Sandbox Code Playgroud)

我很好奇这个选项存在的理由是什么.

javascript node.js promise bluebird

9
推荐指数
2
解决办法
6121
查看次数

Mongoose不会创建TTL索引

这是我的Mongoose模型:

var sessionSchema = new Schema({
    _id: { type: String, required: true, index: { unique: true } },
    user: { type: Schema.Types.ObjectId },
    expire: { type: Date, index: { expireAfterSeconds: 21600 } }
})
module.exports = mongoose.model('Session', sessionSchema)
Run Code Online (Sandbox Code Playgroud)

我需要能够将日期对象设置为过期(通常是Date.now加上几分钟),并在过期6小时后将对象从集合中删除.

但是,我无法让Mongoose创建索引.当我db.sessions.getIndexes()在mongo控制台中运行时,这是输出:

[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "dev.sessions"
    }
]
Run Code Online (Sandbox Code Playgroud)

我也尝试过不同的语法,比如
expire: { type: Date, expires: 21600 }(Mongoose的简写版).
我还尝试在模式级别定义索引:
sessionSchema.index({ expire: 1 }, { expireAfterSeconds: …

javascript mongoose mongodb node.js

7
推荐指数
1
解决办法
2867
查看次数