Javascript 在每个请求上打开文件句柄,而不是仅打开一次
这是关于SFTP协议的,您可以从服务器下载文件 SFTP客户端将发出多个“读取”请求,可能是为了更快地下载多个文件 在正常情况下,服务器收到一个打开的请求,然后多次读取请求,然后关闭 因此,在打开请求中,服务器“打开”本地文件句柄(Javascript 在每个请求上打开文件句柄,而不是仅打开一次,javascript,node.js,io,sftp,fs,Javascript,Node.js,Io,Sftp,Fs,这是关于SFTP协议的,您可以从服务器下载文件 SFTP客户端将发出多个“读取”请求,可能是为了更快地下载多个文件 在正常情况下,服务器收到一个打开的请求,然后多次读取请求,然后关闭 因此,在打开请求中,服务器“打开”本地文件句柄(fs.OPEN),在关闭请求中关闭它(fs.CLOSE)。。。但是,如果客户机很淘气,想要做一些令人讨厌的事情,只是发送多个打开的文件请求,使服务器内存不足,该怎么办 在这种情况下,我认为最好的解决方案是服务器在读取请求中打开文件句柄,并在读取完成后立即关闭它。但会产
fs.OPEN
),在关闭请求中关闭它(fs.CLOSE
)。。。但是,如果客户机很淘气,想要做一些令人讨厌的事情,只是发送多个打开的文件请求,使服务器内存不足,该怎么办
在这种情况下,我认为最好的解决方案是服务器在读取请求中打开文件句柄,并在读取完成后立即关闭它。但会产生其他问题吗?我的意思是,由于多个读取请求可以并行运行,因此可能会有许多文件句柄打开,指向同一个本地文件。要向客户端发送文件,您可以使用
createReadStream
而不是执行fs.open
和fs.close
,类似这样的操作
// in response section...
res.writeHead(200, headers);
fs.createReadStream(file).pipe(res)
要将文件发送到客户端,您可以使用
createReadStream
而不是执行fs.open
和fs.close
,类似这样的操作
// in response section...
res.writeHead(200, headers);
fs.createReadStream(file).pipe(res)
fs.createReadStream()可以处理开始和结束字节,以处理每个后续读取请求。见下文。此外,为了确保恶意用户没有发出请求,您应该在读取文件数据之前处理该请求。如果这是匿名SFTP,您可以对请求者IP执行检查,并将单个IP限制为每个IP的单个打开/读取流。。。或者限制单个IP/文件路径组合。只需将其存储在一个局部变量中,然后打开,添加到日志中,并在完成下载后将其删除
fs.createReadStream('sample.txt', {
'flags': 'r', //<string> See support of file system flags. Default: 'r'.
'encoding': null, // <string> Default: null
'autoClose': true, // <boolean> Default: true
'emitClose': false, // <boolean> Default: false
'start': 0, // <integer>
'end': Infinity, // <integer> Default: Infinity
'highWaterMark': (64 * 1024), // <integer> Default: 64 * 1024
});
资料来源:
改用:ftp srv 综上所述,我认为使用一个名为FTP srv的优秀FTP包会更好,它可以处理所有这些以及更多问题。我在生产中使用过它,每天有数百名用户和数千名每日下载/上传,没有问题。基于你文章中的考虑因素,你将无法防范恶意用户。尤其是涉及FTP/SFTP时,几乎每秒都有大量恶意请求通过扫描机器人程序传入。你需要有一种方法来禁止你发现是恶意的IP。ftp srv将处理所有这些以及更多问题 根据我的经验,最好的节点FTP服务器是: 见: 我与包没有任何关联。fs.createReadStream()可以处理开始和结束字节,以处理每个后续读取请求。见下文。此外,为了确保恶意用户没有发出请求,您应该在读取文件数据之前处理该请求。如果这是匿名SFTP,您可以对请求者IP执行检查,并将单个IP限制为每个IP的单个打开/读取流。。。或者限制单个IP/文件路径组合。只需将其存储在一个局部变量中,然后打开,添加到日志中,并在完成下载后将其删除
fs.createReadStream('sample.txt', {
'flags': 'r', //<string> See support of file system flags. Default: 'r'.
'encoding': null, // <string> Default: null
'autoClose': true, // <boolean> Default: true
'emitClose': false, // <boolean> Default: false
'start': 0, // <integer>
'end': Infinity, // <integer> Default: Infinity
'highWaterMark': (64 * 1024), // <integer> Default: 64 * 1024
});
资料来源:
改用:ftp srv 综上所述,我认为使用一个名为FTP srv的优秀FTP包会更好,它可以处理所有这些以及更多问题。我在生产中使用过它,每天有数百名用户和数千名每日下载/上传,没有问题。基于你文章中的考虑因素,你将无法防范恶意用户。尤其是涉及FTP/SFTP时,几乎每秒都有大量恶意请求通过扫描机器人程序传入。你需要有一种方法来禁止你发现是恶意的IP。ftp srv将处理所有这些以及更多问题 根据我的经验,最好的节点FTP服务器是: 见: 我和这个包裹没有任何关系 在这种情况下,我认为最好的解决方案是服务器在读取请求中打开文件句柄,并在读取完成后立即关闭它 当然 但会产生其他问题吗 为什么会这样 我的意思是,由于多个读取请求可以并行运行,因此可能有许多文件句柄打开指向同一个本地文件 唯一的问题是,一旦达到打开文件的限制(我想您知道
ulimit
),您的服务器将在下次尝试打开时出错。在达到该限制之前,如果描述符用于不同的文件(或套接字、管道或设备…)或同一文件的所有文件,则没有任何区别
在这种情况下,我认为最好的解决方案是服务器在读取请求中打开文件句柄,并在读取完成后立即关闭它
当然
但会产生其他问题吗
为什么会这样
我的意思是,由于多个读取请求可以并行运行,因此可能有许多文件句柄打开指向同一个本地文件
唯一的问题是,一旦达到打开文件的限制(我想您知道
ulimit
),您的服务器将在下次尝试打开时出错。在达到该限制之前,如果描述符用于不同的文件(或套接字、管道或设备…)或同一文件的所有描述符,则没有任何区别。我相信您有一个SFTP服务器,需要向其他人提供访问权,以便从服务器读取数据
您必须创建公钥私钥,并将公钥提供给客户端,和/或创建密码。只有真正的客户端才能在您的服务器上打开连接(限制DDOS类型的攻击)
此外,即使是SFTP编码也必须像数据库一样对待,连接应该共享(连接池),我的意思是说打开连接一次,然后执行尽可能多的读写操作,然后关闭连接。所以,即使需要异步读写文件,也必须首先打开连接并异步读写