|
30.09.2008, 10:23 | #1 |
Участник
|
ошибка обращения к .NET сборке в режиме Server
Здравтвуйте коллеги!
Написал X++ код (DAX 4.0), который обращается к прокси-сборке web-сервиса узла SharePoint. Если данный код работает со свойством RunOn == 'Called from' - то всё ок! Если данное свойство поменять на Server, то выдаются вот такие страшные ошибки: Сбой запроса на разрешение типа "InteropPermission". (S)\Classes\InteropPermission\demand (S)\Classes\CLRObject\new (S)\Classes\ImportContractApprovalInfo_NV\new - line 24 (S)\Classes\ImportContractApprovalInfo_NV\main - line 38 Объект "CLRObject" не может быть создан Вот эти самые line 24: X++: //внешняя прокси-сборка, позволяющая работать с web-сервисом ImortApprovalInfo.ApprovalDocuments_ListService.Lists _listService; ; _listService = new ImortApprovalInfo.ApprovalDocuments_ListService.Lists(); 2) как исправить? |
|
30.09.2008, 12:26 | #3 |
Участник
|
Спасибо за ссылку!
Вставил пермишны: X++: //проверяем возможность доступа к сборке perm = new InteropPermission(InteropKind::ClrInterop); if (perm == null) { return; } perm.assert(); Однако обнаружил следующее некорректное поведение компонента ClrInterOp Метод ClrInterop::isNull в режиме "Server" выдаёт стабильно true! Хотя, как видно из кода ниже, строка strOuterXml ВСЕГДА имеет осмысленные данные (ID="{BB80822A-7849-416B-9BF4-ECD83999F867}). В режиме "Client" метод ClrInterop::isNull работает нормально, и выдаёт true или false в зависимости от реального сотояния объекта. X++: System.Xml.XmlAttributeCollection xacAttributes; System.Xml.XmlAttribute xaAttribute; str strOuterXml; anytype ant; ; xacAttributes = ndListDefinition.get_Attributes(); xaAttribute = xacAttributes.get_ItemOf("ID"); strOuterXml = ClrInterOp::getAnyTypeForObject(xaAttribute.get_OuterXml()); ant = ClrInterop::isNull(xaAttribute); if(!ClrInterop::isNull(xaAttribute)) { _listID = xaAttribute.get_Value(); } else { _listID = "-1"; } Последний раз редактировалось GromRom; 30.09.2008 в 12:28. |
|
10.11.2011, 23:54 | #4 |
Читатель
|
прошли годы...
кстати, а никто не победил это поведение на четверке?
|
|
30.09.2008, 10:44 | #5 |
Участник
|
Ошибки не странные. Почитайте про Code Access Security, к примеру здесь:
http://msdn.microsoft.com/en-us/library/bb190039.aspx О. Точно такая же ссылка выше |
|
30.09.2008, 14:43 | #6 |
Administrator
|
Вот у меня та же проблема возникла, только при использовании ADO. (там использовался класс InteropPermission с типом InteropKind::ComInterop). Т.е. хоть тресни - не выдается разрешение при работе на сервере. Я не знаю - баг это или фича или я просто "не умею готовить", однако - этого поведения достаточно - чтобы я для себя сказал - мне эти разрешения не нужны - и хорошо - что есть возможность их отключить на уровне АОСа... и вообще - эти разрешения - есть вредная и дурацкая приблуда (совершенно не вижу логики в их наличии - только дополнительный код писать приходится).
Может конечно я и резко высказался - но пока я как-то не осознал их полезность и не понял - какой плюс - хотя бы с маркетинговой т.з. они привносят Для отключения этих разрешений на уровне АОСа в реестре (конфигурации) нужно указать у параметра caslevel значение disable PS. В приведенной ссылке выше написано "Code Access Security (CAS) helps protect APIs that have potential security risks ", т.е. как бы разрешения позволяют какие-то риски снизить. Вопрос. Какие риски можно снизить - если все равно все вызовы обрамляются в разрешения???. Т.е. теперь типа если увидел разрешения - значит есть некий потенциально рисковый вызов?. Если не обрамить вызов в разрешение - то вызова не произойдет. Вот я не понимаю этого искусственно выдуманного кода. Код-то не машина пишет - а человек
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 30.09.2008 в 14:48. |
|
30.09.2008, 16:31 | #7 |
Участник
|
Цитата:
Сообщение от sukhanchik
В приведенной ссылке выше написано "Code Access Security (CAS) helps protect APIs that have potential security risks ", т.е. как бы разрешения позволяют какие-то риски снизить. Вопрос. Какие риски можно снизить - если все равно все вызовы обрамляются в разрешения???. Т.е. теперь типа если увидел разрешения - значит есть некий потенциально рисковый вызов?. Если не обрамить вызов в разрешение - то вызова не произойдет. Вот я не понимаю этого искусственно выдуманного кода. Код-то не машина пишет - а человек
|
|
|
За это сообщение автора поблагодарили: sukhanchik (4). |
30.09.2008, 17:52 | #8 |
Administrator
|
Цитата:
Сообщение от gl00mie
Смысл, я так понимаю, в вызове InteropPermission.assert() - это позволяет разработчику "опасного API" осуществить проверку того, можно ли его API использовать в тех или иных условиях и, в случае чего, выкинуть какое-нить исключение типа "фигу вам, а не моё опасное API"... Плюс, разработчиков это заставляет лишний раз подумать, прежде чем что-то использовать. Мне это напоминает поведение Висты: если пользователь собрался сделать что-то эдакое, то его надо двадцать раз переспросить, точно ли он уверен, что хочет это сделать, в трезвом ли он уме и твердой ли памяти
А потом - что значит "лишний раз подумать"? Если мне надо вызвать какую-то WinAPI-функцию или функцию из dll - что я сделаю? Ctrl+C, Ctrl+V из того места, где она работает и исправлю имя функции. Ну еще проверю - что все вызывается. Ну и какая разница сколько строчек кода я скопирую не глядя? Единственное - что меня смущает - это Ваш ответ про метод assert. Т.е. каким образом предполагается (предполагалось) контролировать - в каких условиях используется "опасное" API? Т.е. Windows будет контролировать - где можно вызывать функцию к примеру WinAPI::findWindow, а где нельзя - так что ли? Чего-то не врубаюсь. И интересно еще как это все ложится на Аксапту - где метод assert() ядерный...
__________________
Возможно сделать все. Вопрос времени |
|
30.09.2008, 15:37 | #9 |
Злыдни
|
Цитата:
Microsoft Dynamics AX code access security allows developers to protect dangerous APIs from being invoked by untrusted code (code that does not originate from the Application Object Tree (AOT)). Code access security does this by performing the following actions:
1. It verifies that the code asserted the appropriate permission on the call stack to use the dangerous API. 2. It verifies that the assert (the request to use the dangerous API) was executed in trusted code and saved in the AOT. 3. It verifies that the assert was executed on the same tier as the dangerous API. For Dynamics AX version 4.0, code access security covers the use of dangerous APIs on the server tier only. You do not need to modify or mitigate client-only invocations of dangerous APIs. Цитата:
To help protect computer systems from malicious mobile code, to allow code from unknown origins to run with protection, and to help prevent trusted code from intentionally or accidentally compromising security, the .NET Framework provides a security mechanism called code access security. Code access security allows code to be trusted to varying degrees depending on where the code originates and on other aspects of the code's identity. Code access security also enforces the varying levels of trust on code, which minimizes the amount of code that must be fully trusted in order to run. Using code access security can reduce the likelihood that your code can be misused by malicious or error-filled code. It can reduce your liability because you can specify the set of operations your code should be allowed to perform as well as the operations your code should never be allowed to perform. Code access security can also help minimize the damage that can result from security vulnerabilities in your code.
|
|
|
За это сообщение автора поблагодарили: sukhanchik (4). |
30.09.2008, 16:19 | #10 |
Участник
|
Цитата:
Сообщение от Yprit
см. также http://msdn.microsoft.com/en-us/library/930b76w0.aspx - ноги растут оттуда
|
|
30.09.2008, 16:35 | #11 |
Участник
|
Цитата:
Цитата:
For Dynamics AX version 4.0, code access security covers the use of dangerous APIs on the server tier only. You do not need to modify or mitigate client-only invocations of dangerous APIs.
|
|
30.09.2008, 16:38 | #12 |
Злыдни
|
|
|
30.09.2008, 18:07 | #13 |
Administrator
|
Цитата:
Сообщение от Yprit
1. It verifies that the code asserted the appropriate permission on the call stack to use the dangerous API.
2. It verifies that the assert (the request to use the dangerous API) was executed in trusted code and saved in the AOT. 3. It verifies that the assert was executed on the same tier as the dangerous API. Но получается (если я правильно понял по аглицки): 1. Проверка, что код имеет соответствующее разрешение по стеку вызовов (интересно - какой стек вызовов должен быть, чтобы он не прошел проверку - просто без этого кода?) 2. Проверка, что вызов опасного API был вызван из "доверенного" кода, сохраненного в АОТ. А какой код не доверенный? Не сохраненный в АОТ?. Интересно - во-первых - как такой код исполняется (в Аксапте) и даже не столько это, а сколько то, что в Аксапте так просто создать код, сохраненный в АОТ и вызвать "опасный" код оттуда - что при желании так сделать - это сделать все равно можно. 3. Проверка, что код, вызывающий опасное API - вызывается это на той же стороне (клиент/сервер), что и само API. Вот это совсем непонятно.. Во первых вызвать код там где надо не составляет труда, а во-вторых - да какая разница? Т.е. как бы получается - что эта проверка в общем-то ничего не дает. Только если самому что-то писать (какие-то свои проверки) - тогда проверка нужна... Но тут и вопрос - если самому писать - то зачем тогда поддержка на уровне ядра? Или я что-то не так понял? Попутно присоединяюсь к вопросу автора ветки - почему запрещено-таки вызывать такие вещи, как сборка .NET, как ADO с сервера?
__________________
Возможно сделать все. Вопрос времени |
|
30.09.2008, 20:12 | #14 |
Участник
|
Цитата:
Цитата:
Сообщение от sukhanchik
2. Проверка, что вызов опасного API был вызван из "доверенного" кода, сохраненного в АОТ. А какой код не доверенный? Не сохраненный в АОТ?. Интересно - во-первых - как такой код исполняется (в Аксапте) и даже не столько это, а сколько то, что в Аксапте так просто создать код, сохраненный в АОТ и вызвать "опасный" код оттуда - что при желании так сделать - это сделать все равно можно.
Цитата:
|
|
|
За это сообщение автора поблагодарили: alex55 (1), player (1). |
30.09.2008, 21:57 | #15 |
Administrator
|
Для начала спасибо за столь развернутый ответ. Повторно репутацию увы поднять не могу, поэтому говорю просто спасибо .
Цитата:
Цитата:
Цитата:
Вот формы на сервере - не отобразишь. Но с другой стороны - это и никому не нужно - а если было бы нужно - то тоже я думаю - что можно было бы сделать. .NET - рулит и все такое... Понятно... В общем - резюмируя могу сказать - что пока по крайней мере можно предположить защиту от повторных вызовов X++ - .NET - X++. Хотя фантазии пока хватает на пределе. Т.е. конкретно для этого случая - можно заложить разрешения. Во всем остальном, особенно с ограничениями на серверный/клиентский вызов - не очень понятно. Не всегда ж "опасные" функции вызываются через .NET - иногда и сами по себе .
__________________
Возможно сделать все. Вопрос времени |
|
30.09.2008, 23:59 | #16 |
Участник
|
Цитата:
Сообщение от sukhanchik
пока не могу в голове смоделировать контрпример, в каких случаях этот механизм разрешений именно защитит пользователя от исполнения "опасного" кода. Т.е. представим себе - что все вызовы "опасных" функций обрамляются в разрешения. Чем такой "обрамленный" код отличается от "необрамленного"? Только кол-вом кода, генерацией security cookie и т.д. Т.е. все равно кол-во "опасных" вызовов при этом не уменьшится.
Цитата:
Цитата:
Последний раз редактировалось gl00mie; 01.10.2008 в 00:40. Причина: дополнение |
|
01.10.2008, 10:04 | #17 |
Administrator
|
В любом случае - очередной раз спасибо, gl00mie за потраченное время на разъяснение этого монстрового механизма.
__________________
Возможно сделать все. Вопрос времени |
|
02.12.2009, 15:56 | #18 |
Участник
|
Вопрос: а perm.assert(); должен стоять перед каждым обращением к COM? Или хватает 1 раз в начале?
|
|
02.12.2009, 16:34 | #19 |
Участник
|
это зависит от того, вызывали ли вы revertAssert
|
|
02.12.2009, 18:04 | #20 |
Участник
|
Можно ли одновременно вызвать ассерт для:
ExecutePermission InteropPermission ? Или кто из них главнее? |
|
Теги |
.net, cas, code access security, fileiopermission, interoppermission, security, безопасность |
|
|