Zuerst, um Ihre Frage zu beantworten: Das Sicherheitssystem soll GUTE NUTZER von BAD CODE schützen; es ist ausdrücklich nicht entworfen, GOOD CODE von SCHLECHTEN ANWENDER zu schützen.Ihre Zugriffsbeschränkungen mindern Angriffe auf Ihre Benutzer von teilweise vertrauenswürdigen feindlichen Code. Sie mildern nicht Angriffe auf Ihren Code von feindliche Benutzer. Wenn die Bedrohung ist feindliche Benutzer bekommen Ihren Code, dann haben Sie ein großes Problem. Das Sicherheitssystem mindert diese Bedrohung überhaupt nicht.
Zweitens, um einige der vorherigen Antworten zu adressieren: Um die volle Beziehung zwischen Reflexion und Sicherheit verstehen zu können, bedarf es sorgfältiger Details und eines guten Verständnisses der Details des CAS-Systems. Die zuvor geposteten Antworten, die besagen, dass es zwischen Reflexion und Sicherheit keine Verbindung gibt, sind irreführend und falsch.
Ja, mit Reflection können Sie die Sichtbarkeitsbeschränkungen (manchmal) überschreiben. Das bedeutet nicht, dass es keine Verbindung zwischen Zugang und Sicherheit gibt. Die Verbindung besteht darin, dass das Recht, Reflektion zu verwenden, um Zugriffsbeschränkungen außer Kraft zu setzen, in mehrfacher Hinsicht tief mit dem CAS-System verbunden ist.
Zuerst einmal, um dies zu tun beliebig, Code muss private Reflexion Erlaubnis durch das CAS-System gewährt werden. Dies wird normalerweise nur dem vollständig vertrauenswürdigen Code gewährt, der immerhin schon irgendetwas tun könnte.
Zweitens wird im neuen .NET-Sicherheitsmodell angenommen, dass Assembly A vom CAS-System eine Obermenge des Grant-Sets von Assembly B gewährt wird. In diesem Szenario darf Code in Assembly A Reflektion verwenden, um die Interna von B zu beobachten.
Drittens wird es ziemlich kompliziert, wenn Sie dynamisch generierten Code in den Mix einwerfen. Eine Erklärung dafür, wie "Sichtbarkeit überspringen" und "Eingeschränkte Sichtbarkeit überspringen" funktionieren und wie sie die Interaktionen zwischen Reflexion, Zugriffskontrolle und Sicherheitssystem in Szenarien verändern, in denen Code zur Laufzeit gespuckt wird, würde mehr Zeit und Platz beanspruchen als ich verfügbar haben. Siehe Shawn Farkas Blog, wenn Sie Details benötigen.
Ein "Hacker" könnte Ihren Code ohne die Metadaten von .Net und Java ändern. Jeder erinnert sich an DeHacked http://en.wikipedia.org/wiki/Dehacked Alles, was Sie tun können, hoffen, es so schwer wie möglich zu machen. –