2012-07-11 8 views
7

ServicePointManager.ServerCertificateValidationCallback ist eine globale statische Eigenschaft, die von jedem Stück Code in Ihrer Anwendung einfach, indem Sie überschrieben werden können:Was ist der Grund dafür, dass ServicePointManager.ServerCertificateValidationCallback so konzipiert wurde?

ServicePointManager.ServerCertificateValidationCallback 
    = (sender, cert, chain, sslPolicyErrors) => true; 

Warum haben sie sich entscheiden, es auf diese Weise zu implementieren? Sicherlich sollte es eine Eigenschaft auf dem WebRequest Objekt sein, und Sie sollten einen sehr guten Grund dafür haben, warum Sie das Zertifikat ignorieren.

+0

Also was Sie beschweren ist, dass dies eine statische Eigenschaft anstelle einer Instanzeigenschaft ist, die es schwierig macht, unterschiedliche Richtlinien in unabhängigen Teilen der Anwendung zu verwenden? – CodesInChaos

+2

Nein, weil irgendein Bit von Drittanbieter-Code, den Sie konsumieren, wie SDKs usw., Ihren Callback überschreiben und überschreiben kann. – superlogical

+0

Das sieht für mich nicht wie eine Frage aus. Sie beschweren sich nur über einen unnötigen Gebrauch des globalen veränderbaren Zustandes. – CodesInChaos

Antwort

5

Anderer Code, der diese Eigenschaft festlegen kann, ist kein Sicherheitsproblem, da zum Festlegen der Eigenschaft die Berechtigung SecurityPermissionFlag.Infrastructure erforderlich ist, die Sie für Code, dem Sie nicht vertrauen, nicht benötigen.

Auf der anderen Seite stimme ich zu, dass es schlechtes Design ist, da es globalen veränderlichen Zustand ist und das sollte vermieden werden. Insbesondere macht es unnötig schwierig, unterschiedliche Validierungsrichtlinien in verschiedenen Teilen des Programms zu verwenden. Eine gemeinsame Konfigurationsdatei, wie Sie vorschlagen, wäre noch schlimmer IMO.

Die richtige Wahl wäre eine Instanzeigenschaft für den Rückruf, genau wie die Klasse SslStream. Ich kenne diesen Teil des Frameworks nicht genug, um zu sagen, ob diese Eigenschaft existiert, und daher dient ServicePointManager.ServerCertificateValidationCallback nur als Standard, oder wenn diese globale Variable die einzige Möglichkeit ist, die Zertifikatsprüfung zu beeinflussen.

Verwandte Themen