Безопасный инъекционный вызов IAxaptaRecord.ExecuteStmt () - PullRequest
3 голосов
/ 18 мая 2009

Существует ли безопасный способ звонка через бизнес-разъем axpata

string salesId = someObject.Text;

IAxaptaRecord salesLine = ax.CreateRecord("SalesLine");
salesLine.ExecuteStmt("select * from %1 where %1.SalesId == '" + salesId + "'"); 

Если для someObject.Text задано следующее, то я уязвим для внедрения кода x ++:

"SomeSalesOrder' || %1.SalesId == 'SomeOtherOrder"

Есть ли способ параметризации запроса, или было бы лучше написать весь код доступа к данным непосредственно в x ++, а затем вызвать его из COM?

Ответы [ 3 ]

2 голосов
/ 18 мая 2009

Невозможно быть уверенным, что вы охватили все случаи ...

Использование ExecuteStmt, скорее всего, неправильный подход. Вы должны написать свой выбор или что-то еще в методе Axapta (с параметрами), а затем вызвать этот метод.

0 голосов
/ 19 мая 2009

Holz,

Вы можете использовать параметризованные операторы SELECT с ключевым словом forcePlaceholder. Это поведение по умолчанию в X ++, но так как это поведение может быть переопределено для сложных объединений, хорошей идеей является неявное указание подсказки forcePlaceholder.

Поскольку параметризованные SELECT накладывают некоторые дополнительные издержки и не позволяют оптимизировать фактические значения параметров, вы можете рассмотреть возможность использования представлений или запросов axapta.

С уважением, Велислав Маринов

0 голосов
/ 18 мая 2009

вы должны сделать замену на 'to \' например,

string salesId = someObject.Text.Replace("'", "\\'");
...