|
05.03.2011, 17:51 | #1 |
Member
|
Кто автор этого "гениального" кода?
\Data Dictionary\Maps\CustVendTable\Methods\balanceAllCurrency()
X++: //BP Deviation Documented display AmountCur balanceAllCurrency(CurrencyCode _currencyCode = this.Currency) { ... switch (custVendTrans.TableId) { case tablenum(CustTrans) : hasAccess = hasFieldAccess(tablenum(CustTrans), fieldnum(CustTrans, AmountCur), AccessType::View); hasAccess = hasAccess && hasFieldAccess(tablenum(CustTrans), fieldnum(CustTrans, AmountMST), AccessType::View); hasAccess = hasAccess && hasFieldAccess(tablenum(CustTrans), fieldnum(CustTrans, ExchAdjustment), AccessType::View); break; case tablenum(VendTrans) : hasAccess = hasFieldAccess(tablenum(VendTrans), fieldnum(VendTrans, AmountCur), AccessType::View); hasAccess = hasAccess && hasFieldAccess(tablenum(VendTrans), fieldnum(VendTrans, AmountMST), AccessType::View); hasAccess = hasAccess && hasFieldAccess(tablenum(VendTrans), fieldnum(VendTrans, ExchAdjustment), AccessType::View); break; } if (!hasAccess) throw error("@SYS57330"); ...
__________________
С уважением, glibs® |
|
09.03.2011, 16:55 | #2 |
северный Будда
|
Вот я бы, увидев ноль в форме/отчёте, принял бы его за результат вычислений, но никак не за проблему прав доступа. Так что с этой точки зрения всё логично. Другое дело, что вешать такую проверку именно на дисплей - мегастранно. Я бы сначала проверил права человека на доступ к объекту, и если они есть - строил бы без всяких исключений.
__________________
С уважением, Вячеслав Последний раз редактировалось pitersky; 09.03.2011 в 17:17. |
|
09.03.2011, 18:27 | #3 |
Member
|
Цитата:
Сообщение от pitersky
...
Вот я бы, увидев ноль в форме/отчёте, принял бы его за результат вычислений ... Если поле рассчитано по query, а в query не отключен RLS принудительно в коде, то результат расчета будет зависеть от настроек RLS. В Аксапте есть ряд таких мест.
__________________
С уважением, glibs® |
|
09.03.2011, 19:32 | #4 |
Участник
|
Видеть ноль вместо скрытого столбца - не правильно. Видеть столбец, который должен быть скрыт - не допустимо. Исключение, которое выдаётся в display методе - это фол последней надежды. Сообщение предназначено не для пользователя, а для программиста, который забыл разрулить права на уровне дизайна.
P.S.: Очень к стати в таких случаях было бы задействовать nullable тип. Жаль что в аксапте нет такой возможности. . |
|
12.03.2011, 22:55 | #5 |
Участник
|
Цитата:
Сообщение от S.Kuskov
Видеть ноль вместо скрытого столбца - не правильно. Видеть столбец, который должен быть скрыт - не допустимо. Исключение, которое выдаётся в display методе - это фол последней надежды. Сообщение предназначено не для пользователя, а для программиста, который забыл разрулить права на уровне дизайна.
P.S.: Очень к стати в таких случаях было бы задействовать nullable тип. Жаль что в аксапте нет такой возможности. . Кстати throw error() как сообщение для разработчика в дисплей методе весьма не удобно, т.к. из формы уже не выйдешь - приходится три пальца в рот.... |
|
13.03.2011, 12:44 | #6 |
Member
|
Цитата:
Сообщение от S.Kuskov
...
Сообщение предназначено не для пользователя, а для программиста, который забыл разрулить права на уровне дизайна. ... Я отключил на уровне настроек доступа на форме display-метод. При открытии просмотра всех полей в паспорте записи все равно наткнулся на это же сообщение об ошибке. Т.е. технически данный функционал недоработан. Для меня тема интересна в следующем ключе. Раньше были display-методы (edit-методы потом появились на их подобии). Потом этот контрол был признан опасным с т.з. безопасности. Пришлось писать "// BP deviation documented". Некоторые вот идут дальше. И не всегда удачно. Для меня не до конца понятно какой сегодня ВР по использованию display-методов. ... Подумал. Вот нашел. " Using Display and Edit methods When you use a display or edit method, consider using record-level security if a value is returned from another row. However, record-level security is not required in these situations: • If the value is derived. • If the value is based only on fields in the current record. " " Display and Edit Methods You can enforce security on display or edit methods on forms (but not on reports) when the method is declared on the table in the AOT. In practice, if a user has access to a table, the user also has access to all of the display methods (from reports). In theory, a display method can expose any data from any table. If a display method returns data from another table (or another row in the same table), it poses a threat. The following examples illustrate these vulnerabilities. Example (Table: InventItemGroup) X++: display ForecastHasSales hasSalesBudget() { return (select forecastSales where forecastSales.itemGroupId == this.itemGroupId).recId != 0; } X++: server display InterestAmountCur sumInterestAmount() { InterestAmountCur interestAmountCur; CustInterestTrans custInterestTrans; while select sum(InterestAmount) from custInterestTrans group by CurrencyCode where custInterestTrans.InterestNote == this.InterestNote && custInterestTrans.InterestCalculate { interestAmountCur += custInterestTrans.custInterestAmount(this); } return interestAmountCur; } If a display method returns data from the same row but from another column, it also poses a threat. For example, a user may not be allowed to see another person’s monthly salary, but could run a query to ask for the annual salary (calculated value). Mitigation To mitigate threats associated with the use of display and edit methods, follow these steps: 1. Evaluate each display method that returns data from another row, either in the same table or a different table. 2. Discuss (internally) if this data poses an information-disclosure threat. 3. If the data does pose a threat, perform explicit authorization checks, and throw an exception if access is unauthorized. " Надергано из документа "Microsoft Dynamics AX 4.0 Writing Secure X++ Code". Кстати приведенный мною в первом посте пример как раз соответствует рекомендациям . Только как-то некрасиво получается в плане usability. Это сообщение для кого? Если для того кто настраивает права — то было бы удобнее без exception. Ну и с более внятным сообщением об ошибке. Вообще с настройкой дотупа на контролы в форме на display-методах всегда были проблемы. Посидишь, настроишь. Разработчик пошевелит дизайн формы — высока вероятность что настройки слетят. Сидишь потом как дурачок восстанавливаешь везде. В общем, ожидалось удобное решение, а не такое вот...
__________________
С уважением, glibs® |
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |
09.03.2011, 17:16 | #7 |
Гость
|
Цитата:
Я бы сначала проверил права человека на доступ к объекту
|
|
09.03.2011, 17:23 | #8 |
северный Будда
|
А по-моему - очень даже мешает.
Т.е. если у человека нет прав на просмотр поля репорта - надо просто скрыть это поле и всё. Дисплей-то здесь причём?
__________________
С уважением, Вячеслав |
|
09.03.2011, 19:19 | #9 |
Гость
|
Цитата:
если у человека нет прав на просмотр поля репорта
Цитата:
\Data Dictionary\Maps\CustVendTable\
Цитата:
Если поле рассчитано по query
|
|
10.03.2011, 02:53 | #10 |
Участник
|
А каким образом, если не секрет, применительно к этому display-методу мог бы помочь nullable-тип? Отображать в FormRealControl null вместо числа?..
|
|
10.03.2011, 08:43 | #11 |
Участник
|
Не всегда выбрасывать исключение удобно. Подход с отображением вместо скрытых данных заглушки (будь то ноль или null) позволяет отображать результаты сложных display методов, доступ к данным которых может быть различным в рамках одной выборки. Т.е. в одном и том же столбце грида могут быть выведены доступные для просмотра данные и null'ы вместо скрытых
Как по мне, так null лучше, чем двусмысленный ноль. Также если это null значение вдруг будет использоваться дальше для дальнейших вычислений, то логично ожидать в результате тоже null (в варианте с нулём может получиться неполноценное выражение, которое может ввести пользователя в заблуждение). Лучше конечно заложить в систему два режима работы - отображать null либо генерить исключение (что-то вроде свойства allowNull на контроле). Чтобы в каждом конкретном случае можно было бы вибирать наиболее ожидаемое поведение. |
|
10.03.2011, 07:06 | #12 |
Гость
|
вроде только что обсудили, что такое //BP Deviation Documented и то, что проверки на доступ к дисплей-эдит методам теперь по БП ДОЛЖНЫ быть...
|
|
10.03.2011, 07:53 | #13 |
Member
|
Должнны быть. Однозначно.
Остался вопрос какими они должны быть.
__________________
С уважением, glibs® |
|
13.03.2011, 09:13 | #14 |
Гость
|
throw error() - (генерация исключения) - это ОТКАЗ В ОБСЛУЖИВАНИИ и никакими "0.00", "null" и проч. заменен быть не может.
Зацикливание дисплей-методов на контролах в таком случае - это косяк. Но это к теме не относится. По поводу информативности еще можно что-то обсуждать, но оно тоже вполне в стилистике аксапты и шоком ни для кого быть не должно. Если уж хотите реально вменяемые сообщения - нужно переписывать их все, чтоб не выбивалось. |
|
13.03.2011, 13:09 | #15 |
Гость
|
изменить архитектуру (даже в мелочах) возможно только при переходе на иной программный продукт. Который не будет поддерживать сделанные ранее наработки по БП (в нашем случае, приложения).
Потому про удобство нужно забыть. Радуйтесь, что решаются вопросы с надежностью. |
|