tcl - 处理来自不受信任的套接字(和其他流)的 DoS

标签 tcl

This TIP使我困惑。好像是说-buffering line使输入缓冲区无限大,当我认为行缓冲只影响输出的刷新?我不能用 -buffersize 5000连同-buffering line保护我免受排长队的人的伤害?如果可以,那有什么好处chan pending ?发现缓冲区何时已满而没有换行符?

还是有两个不同的缓冲区?一种只是用于预读数据以节省时间,一种是内部命令,如 getsread用?

编辑:或者是仅在您使用 gets 时才产生问题因为它不返回部分行?是否gets将流放入无限大缓冲区模式,否则如果缓冲区在没有换行符的情况下填满,gets 将永远不会返回它?这是 TIP 所说的“行缓冲模式”吗?

最佳答案

首先,-buffersize选项用于输出,而不是输入。在过去的几年里,我从来不需要设置它; Tcl 的缓冲区管理很不错。

其次,-buffering选项也用于输出。

第三,如果您使用阻塞 channel ,您很容易受到有人向您发送一条很长的线路的影响。除了等待行尾(或文件尾)到来之外,你没有机会做任何事情。

但是在非阻塞模式下,事情更加微妙。你会得到一个可读的 fileevent对于 channel (与文件无关,但您可以更轻松地检查它们的大小是否正常,并且在任何情况下它们通常都不是问题)并执行 gets $theChannel line ,返回 -1。 (如果 0 或更多,你有一个完整的行。)

那么-1是什么意思呢?嗯,这意味着要么该行不完整,要么您已经到了流的末尾。您可以通过 fblocked 区分大小写/chan blocked (或 eof 以检测相反的情况)并且您发现该行还不存在。现在怎么办?使用 chan pending input 查看缓冲了多少数据;如果有一个愚蠢的数量(其中“愚蠢”是可调的),那么是时候放弃 channel 了,因为另一边不好(即,只是 close 它)。

我还没有看到 chan pending output 的真正用途这对可写文件事件并不满意,但这通常不是一个大问题:只需使用 fcopy/chan copy将数据从大型来源假脱机到(慢速)输出 channel 工作正常,而不会大量膨胀缓冲区。

关于tcl - 处理来自不受信任的套接字(和其他流)的 DoS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17703398/

相关文章:

linux - 将 spawn 与 Expect 一起使用时僵尸 telnet 进程堆积

tcl - 如何在 Tcl 中连接用大括号转义的字符串?

sorting - TCL自定义排序

linux - Tcl 如何在此脚本中显示名称?

tcl - 如何在tcl中将列表转换为字符串

python - 线程和 tkinter

debugging - TCL脚本调试

tcl - 删除 Tcl 命令中的文件路径和扩展名

在 TCL 代码中从 C (example.i) 调用函数

function - 为什么Tcl变量命令总是返回一个空字符串?