Hallo,
ich bin dabei mich in Boost Asio einzuarbeiten. Die Verbindung zwischen Serverprogramm und Clientprogramm aufzubauen und Daten austauschen klappt alles, aber zwei Dinge sind für mich noch nicht ganz klar:
1. Zum Thema Datentyp: Nach einigen Compilerfehlern habe ich durch ausprobieren herausgefunden, dass unterschiedliche Datentypen auch unterschiedlich an den buffer weitergegeben werden müssen.
Bei einem std::array geht es nur so:
Und bei einem integer geht es nur so:
Zum Verständnis, wieso muss bei std::array einfach der Variablenname eingefügt werden während beim integer die Sache per Referenz übergeben wird und dazu die Angabe von sizeof?
2. Zum Thema Sicherheit: Wenn ich aus Spaß das versendete Array größer mache als das vom Empfangsbuffer dann führt dies zu Dingen die denke ich lieber nicht passieren sollten:
Im Client:
Im Server:
Wenn ich nun die Daten vom Client zum Server übertrage und die Werte ausgebe, erhält die integer-Variable test im Server den Wert 8 obwohl dies ein Wert des arrays ist. Das heißt, nur durch Vergrößern des Arrays im Client, kann es im Server schon zu nicht gewollten Dingen kommen. Wohin werden die verbleibenden Daten geschrieben für die der buffer im Server kein Platz freihält? Ist kenne mich mit dem Thema noch nicht wirklich aus aber wäre das nicht ein Stapelüberlauf und damit eine klassische Sicherheitslücke? Was tun dagegen?
Grüße
ich bin dabei mich in Boost Asio einzuarbeiten. Die Verbindung zwischen Serverprogramm und Clientprogramm aufzubauen und Daten austauschen klappt alles, aber zwei Dinge sind für mich noch nicht ganz klar:
1. Zum Thema Datentyp: Nach einigen Compilerfehlern habe ich durch ausprobieren herausgefunden, dass unterschiedliche Datentypen auch unterschiedlich an den buffer weitergegeben werden müssen.
Bei einem std::array geht es nur so:
Code:
std::array<int,5> arr {8,8,8,8,8};
async_write(the_socket, boost::asio::buffer(arr), write_handler);
Und bei einem integer geht es nur so:
Code:
int test = 5;
async_write(the_socket, boost::asio::buffer(&test, sizeof(test)), write_handler);
Zum Verständnis, wieso muss bei std::array einfach der Variablenname eingefügt werden während beim integer die Sache per Referenz übergeben wird und dazu die Angabe von sizeof?
2. Zum Thema Sicherheit: Wenn ich aus Spaß das versendete Array größer mache als das vom Empfangsbuffer dann führt dies zu Dingen die denke ich lieber nicht passieren sollten:
Im Client:
Code:
std::array<int,5> arr {8,8,8,8,8};
async_write(the_socket, boost::asio::buffer(arr), write_handler);
int test = 5;
async_write(the_socket, boost::asio::buffer(&test, sizeof(test)), write_handler);
Im Server:
Code:
std::array<int,2> arr {0};
the_socket.read_some(boost::asio::buffer(arr));
int test = 0;
the_socket.read_some(boost::asio::buffer(&test, sizeof(test)));
Wenn ich nun die Daten vom Client zum Server übertrage und die Werte ausgebe, erhält die integer-Variable test im Server den Wert 8 obwohl dies ein Wert des arrays ist. Das heißt, nur durch Vergrößern des Arrays im Client, kann es im Server schon zu nicht gewollten Dingen kommen. Wohin werden die verbleibenden Daten geschrieben für die der buffer im Server kein Platz freihält? Ist kenne mich mit dem Thema noch nicht wirklich aus aber wäre das nicht ein Stapelüberlauf und damit eine klassische Sicherheitslücke? Was tun dagegen?
Grüße