04.11.2008, 17:39 | #1 |
Участник
|
Code Access Security - ошибка Best Practice
Господа, помогите пожалуйста!
Проблема суть следующая: есть класс, свойство RunOn = 'Called from'. В методе run используется объект класса TextIO: void run() { TextIO logFile; … ; … logFile = new TextIo("c:\\temp\\vhAPI_log.log", 'W'); … } При компиляции появляется ошибка Best Practice следующего содержания: "TwC: Assert usage of API TextIo.new because it is protected by Code Access Security" ВОПРОС: как нужно модифицировать код, чтобы этот Best Practice исчез? ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: 1. Использование //BP deviation documented лишь преобразует error Best Practice в info Best Practice. 2. Использование соответсвующего "permission" ошику Бест Практиз не убирает void run() { TextIO logFile; FileIOPermission permission; … ; … permission = new FileIOPermission("c:\\temp\\vhAPI_log.log", 'W'); permission.assert(); … // invoke protected API logFile = new TextIo("c:\\temp\\vhAPI_log.log", 'W'); … } 3. Единственно когда ошибка НЕ появляется: если RunOn класса = "Client" или метод, использующий TextIO является client static Заранее спасибо! |
|
04.11.2008, 18:02 | #2 |
Участник
|
А если permission.assert() сделать непосредственно перед new TextIO?
|
|
04.11.2008, 18:15 | #3 |
Участник
|
Цитата:
В ней были изменены правила доступа кода к файловой системе, WinAPI, буферу обмена и т.п. Для того, чтобы TextIO работал, его надо обрамить специальным классом. Об этом хорошо написано в хелпе. Например, здесь http://msdn.microsoft.com/en-us/libr...36(AX.10).aspx Пример как надо обрамлять X++: public void run() { QueryRun qr; FileIoPermission _perm = new FileIoPermission("c:\\000\\test.txt",'w'); TextBuffer textBuffer = new TextBuffer(); ; qr = this.queryRun(); while( qr.next() ) { ... textBuffer.appendText("...something..."); } _perm.assert(); textBuffer.toFile("c:\\000\\test.txt"); CodeAccessPermission::revertAssert(); } |
|
04.11.2008, 18:43 | #4 |
Участник
|
|
|
04.11.2008, 19:30 | #5 |
Участник
|
Объявление переменной FileIoPermission в тексте метода должно стоять ДО объявления переменной TextIO.
|
|
05.11.2008, 10:59 | #6 |
Участник
|
Цитата:
Почему тогда она(ошибка) исчезает если RunOn класса = "Client"?? В принципе, если Best Practice о чем-то "ругает", то должен существовать подход, позволяющий этой "ругани" избежать, или я что-то не понимаю? |
|
05.11.2008, 11:05 | #7 |
Участник
|
Цитата:
Цитата:
|
|
05.11.2008, 11:07 | #8 |
Боец
|
А если поставить breakpoint в соответствующем классе SysBPCheckXXXXX и посмотреть причину...?
(чисто технический подход ) |
|
05.11.2008, 11:08 | #9 |
Участник
|
Ну, ругань происходит, потому что если код работает с RunOn != Client, то это значит, что он может теоретически выполнятся на сервере, и пути будут уже не клиентские, а серверные. И файлы - серверные. А все, что касается сервера приложений, должно быть защищено - и это, думаю, разумно.
Соответственно, работать с файлами на сервере является Bad Practice. По поводу же избежания - это сделать можно - если посмотрите класс WinAPIServer - увидите, что там нормально работает работа с файлами. |
|
05.11.2008, 11:48 | #10 |
Участник
|
Цитата:
Сообщение от gl00mie
Одна из Best Practices - читать документацию и использовать поиск по форуму Конечно, такой подход существует - он описан в документации, в частности, в Dynamics AX Writing Secure X++ Code
"Dynamics AX Writing Secure X++ Code" документ мне знаком: в нем то и описываются(равно как и в msdn) пермишн-классы для всех "опасных" API в Аксапте, в том числе и FileIOPermission.. Непонятно только следующее: класс CCHTMLSave, sys-layer, runOn = "Called from", метод run(), в общем, аналогичная моей ситуация, ОДНАКО в качестве "антидота" на TWC Best Practice используется..правильно, //BP Deviation Documented Причем это не единственный класс в DAX 4.0 с подобным подходом. Получается что в данной ситуации - использование //BP единственный выход?? |
|