Ich möchte einen Server einrichten, auf dem Schüler Code für einen Kurs hochladen und ausführen können. Ich möchte jedoch nicht, dass sie auf verschiedene Funktionen wie system () zugreifen, was einen schlechten Zugriff auf meinen Server ermöglichen könnte. Ich kann die Pre-Prozessor-Ausgabe für einen expliziten Funktionsaufruf durchsuchen, aber wenn der Benutzer einen Funktionszeiger wie folgt macht:
%Vor%Ich bin immer noch offen für die Bedrohung. Ich kann jedoch nicht einfach nach der Zeichenfolge "system" suchen, da es sich um einen gültigen Namen handelt. Wenn der Student cstdlib nicht enthält, könnte er diesen Namen als Variablennamen verwenden. Da dies ein Programmierkurs ist, ist es eine schlechte Idee, eine schwarze Liste von zehn Meilen langen Variablennamen zu haben.
Gibt es eine Möglichkeit, die Funktionen anders als namentlich zu definieren und mir zu erlauben, nach dieser anderen Bezeichnung zu suchen, bevor ich ihren Code kompiliere?
Bei weitem die einfachste Lösung ist, den Code zu kompilieren - das ist ziemlich harmlos - und dann die tatsächlichen Bibliotheksimporte zu betrachten. Benutzer haben möglicherweise ihr eigenes system
definiert, aber das würde nicht dazu führen, dass system
von glibc
importiert wird.
Der Hauptgrund, warum Sie sich den rohen Quellcode nicht ansehen können, ist, weil #define
es böswilligen Benutzern erlaubt, die Namen der schwarzen Listen zu verstecken. Aber es gibt viele andere Möglichkeiten, dies zu tun, einschließlich
Sie benötigen also eine Verarbeitung der Quelle, und es ist wahrscheinlich am einfachsten, die gesamte Quelle vollständig zu verarbeiten.
Ich würde auch vorschlagen, das in einem chroot
als nicht-privilegierter Benutzer auszuführen. Es ist leichter als eine VM.
Leider ist es (leicht) nicht möglich, einen Funktionsnamen von einem Zeiger zu erhalten Wie erhält man den Namen der Funktion vom Zeiger der Funktion in C? < Diese Frage ist aus einer C-Perspektive, aber es ist im Wesentlichen das gleiche Problem.
Tags und Links c++