当前位置:  开发笔记 > 编程语言 > 正文

如何限制.NET中StreamReader.ReadLine()读取的字符数?

如何解决《如何限制.NET中StreamReader.ReadLine()读取的字符数?》经验,为你挑选了1个好方法。

我正在用C#编写Web服务器应用程序,并使用StreamReader类从底层NetworkStream中读取:

 NetworkStream ns = new NetworkStream(clientSocket);
 StreamReader sr = new StreamReader(ns);
 String request = sr.ReadLine();

此代码容易受到DoS攻击,因为如果攻击者永远不会断开连接,我们将永远不会读完该行.有没有办法限制.NET中StreamReader.ReadLine()读取的字符数?



1> Marc Gravell..:

您必须使用Read(char[], int, int)过载(确实限制了长度)并进行自己的行尾检测; 不应该太棘手.

对于稍微懒惰的版本(使用单一阅读版本):

static IEnumerable ReadLines(string path, int maxLineLength)
{
    StringBuilder currentLine = new StringBuilder(maxLineLength);
    using (var reader = File.OpenText(path))
    {
        int i;
        while((i = reader.Read()) > 0) {
            char c = (char) i;
            if(c == '\r' || c == '\n') {
                yield return currentLine.ToString();
                currentLine.Length = 0;
                continue;
            }
            currentLine.Append((char)c);
            if (currentLine.Length > maxLineLength)
            {
                throw new InvalidOperationException("Max length exceeded");
            }
        }
        if (currentLine.Length > 0)
        {
            yield return currentLine.ToString();
        }                
    }
}

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有