我正在用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();
}
}
}