Home > Blockchain >  Alternative method instead of ReadToEnd()
Alternative method instead of ReadToEnd()

Time:08-11

I'm using ReadToEnd() method in LoginController as shown below. But instead of this, I need to replace this with some alternative method.

var fileStream = System.IO.File.Open(environment.ContentRootFileProvider.GetFileInfo("/key.crt").PhysicalPath, FileMode.Open, FileAccess.Read);
string text;
using (var streamReader = new StreamReader(fileStream,Encoding.UTF8))
{
  text = streamReader.ReadToEnd();
}
Response response = new Response(text, samlTmp);

Because I heard somewhere that this call to ReadToEnd() in LoginController might allow an attacker to crash the program.

CodePudding user response:

May be File.ReadAllText(); can help if you are reading from file.

CodePudding user response:

One could limit the data size of the input. In addition, it would be possible to read in the data asynchronously using a thread and to pause the thread or set it to sleep after a certain size of data in order to avoid overloading the server.

To set a Thread on sleep you could use: Thread.Sleep('time in ms') Lookup on the link below to read more about Thread.Sleep

[link] https://docs.microsoft.com/en-us/dotnet/api/system.threading.thread.sleep?view=net-6.0

CodePudding user response:

You may read one block of char at a time, this way you can limit the max length of the stream

using System.IO;
using System.Text;

int offset = 0; 
int maxLength = 1_000_000; // Max Length of the stream
short bufferSize = 4096; // Size you want to read each time
char[] buffer = new char[bufferSize];
StringBuilder builder = new StringBuilder();

using (StreamReader reader = new StreamReader(""))
{
    while((offset   reader.ReadBlock(buffer, offset, bufferSize)) != 0 && offset < maxLength) 
    { 
        builder.Append(buffer);
    }
}

In the end, you can access the file content from builder.ToString()

  • Related