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

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

该代码容易受到DoS攻击,因为如果攻击者从未断开连接,我们将永远不会读完该行。是否有任何方法来限制.NET中StreamReader.ReadLine()读取的字符数?

最佳答案

您将不得不使用Read(char[], int, int)重载(确实会限制长度)并进行自己的行尾检测;不应该太棘手。

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

static IEnumerable<string> 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();
        }
    }
}

10-06 00:30