Каково обоснование того, что ServicePointManager.ServerCertificateValidationCallback разработан таким образом?

ServicePointManager.ServerCertificateValidationCallback это глобальное статическое свойство, которое может быть перезаписано любым фрагментом кода в вашем приложении, просто выполнив:

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

Почему они решили реализовать это таким образом? Конечно, это должно быть свойство на WebRequest объект, и у вас должна быть очень веская причина, по которой вы игнорируете сертификат.

1 ответ

Другой код, который может установить это свойство, не является проблемой безопасности, поскольку для установки свойства требуется SecurityPermissionFlag.Infrastructure разрешение, которое вам не нужно предоставлять коду, которому вы не доверяете.

С другой стороны, я согласен, что это плохой дизайн, так как это глобальное изменяемое состояние, и этого следует избегать. В частности, это делает излишне трудным использование разных политик проверки в разных частях программы. Общий конфигурационный файл, как вы предлагаете, был бы еще хуже IMO.

Правильный выбор был бы свойством экземпляра для обратного вызова, так же, как простой SslStream класс использует. Я не достаточно знаком с этой частью структуры, чтобы сказать, существует ли это свойство, и, следовательно, ServicePointManager.ServerCertificateValidationCallback только по умолчанию, или если эта глобальная переменная является единственным способом повлиять на проверку сертификата.

Другие вопросы по тегам