2009-05-18 86 views
3

是否有注射安全的方式通過axpata業務接口調用注射安全調用IAxaptaRecord.ExecuteStmt()

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?

回答

2

沒有辦法,以確保你已經把所有情況下...

使用ExecuteStmt最有可能是錯誤的做法。您應該在Axapta方法中寫入您的選擇或其他內容(使用參數),然後調用該方法。

-2

你應該做一個取代「爲\」 例如

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

我正在尋找由框架處理,以處理所有的特殊情況,不只是我給 – holz 2009-05-18 04:52:44

+0

的例子,您可以創建IAxaptaRecord擴展方法是像「ExecuteParametizedStmt一個參數化方法(查詢字符串,params對象[]) 這將接受由預計的String.format格式的查詢,並建立它的方式,對變量(比如逃逸) – 2009-05-20 00:12:32

+0

整個問題是處理逃逸執行所需的工作之後正確。如果查詢是「select * from%1.Id == {0}」(其中{0}應該是一個int),然後傳入「42 || 1 == 1」,則注入將在I用你給的方法逃脫了。 我不知道所有的x的邊緣情況++注射在這裏,所以我不想寫我自己的逃逸方法。因爲如果我這樣做的話,我很可能會錯過一些東西,而且只有在它爲時已晚時纔會發現它。這是一個面向公衆的網絡應用程序,有很多機密信息,所以我需要100%認爲沒有注射風險。 – holz 2009-05-20 12:04:42

-2

Holz,

您可以使用帶有forcePlaceholder關鍵字的參數化SELECT語句。 這是在X ++的默認行爲,但由於這種行爲可以被覆蓋了複雜的連接,這是好主意,暗中指定forcePlaceholder提示。

作爲參數化的SELECT強加一些額外的開銷,並且不允許對參數的實際值optimiziation,你可能要考慮使用的意見,或Axapta的查詢來代替。

問候, Velislav馬林諾夫