2011-01-11 29 views
5

我正在設計一個Web部件,用戶可以在其中輸入搜索短語的MOSS搜索索引。我使用FullTextSqlQuery類進行搜索。Sharepoint企業SQL搜索語法中的SQL注入

當我創建我的select語句時,我顯然必須使用連接來包含用戶的輸入。最後的聲明應該是這樣的:

SELECT title, author from portal..scope() 
WHERE ("SCOPE" = 'TheDocuments') 
AND CONTAINS(MYPROPERTY, 'TheValueThatuserSpecified') 

所以,問題是,我該如何避免SQL(?)從用戶輸入注入?是否有一些特定的效用函數?在php/mysql項目中,我會使用mysql_real_escape_string。在SharePoint命名空間中有類似的東西嗎?

回答

2

我還沒有發現任何功能來編碼用戶輸入,所以我創建了自己的方法:

protected override string EncodeUrlParameter(string paramValue) 
{ 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < paramValue.Length; i++) 
    { 
     char c = paramValue[i]; 
     if (c == '*' || c == '%' || c == '[' || c == ']' || c == '_') 
      sb.Append("[").Append(c).Append("]"); 
     else if (c == '\'') 
      sb.Append("''"); 
     else 
      sb.Append(c); 
    } 
    return sb.ToString(); 
} 

這主要用於使用LIKE關鍵字過濾參數(the documentation page has a note about this) 。我偶然發現的最大的問題是,當人們試圖在他們的疑問中包括撇號時。

2

的FullTextSQLQuery類需要一個 「全文SQL」 查詢這不是真正的 SQL。將「全文sql」解析並轉換爲 數據庫中的表,並將其轉換爲 對 數據庫中的表進行查詢,並對 外部索引文件進行查詢。有沒有辦法通過「全文 sql」做sql注入 ,它不會通過驗證。在「完整 文本sql」中使用的「列名」 必須在搜索 管理中設置的有效「管理 屬性」,它們不指向 表上的實際列名稱。

http://www.sharepointdev.net/sharepoint--search/is-fulltextsqlquery-protected-against-sql-injection-35184.shtml

+1

確實如此,但用戶可以通過這種方式輸入搜索短語,例如`')AND CONTAINS(ANOTHEROPYPY,'Anothervalue)或者(SCOPE ='AnotherScope`),這會產生一個有效的搜索查詢,但方式完全不同。要點是 - 你必須注意逃脫的撇號,引號等 – naivists 2011-01-11 15:02:19