近期在處理一項白箱源碼掃描的Stored XSS風險,<br /> <br /> Source code是使用ASP.NET Webform撰寫,<br /> <br /> GridView直接透過SqlDataSource來取得資料,<br /> <br /> 風險內容是從table取出資料後放上Textbox上的這部分被掃出沒有針對值做處理,<br /> <br /> 可能有XSS的風險在:<br /> <br /> https://gist.github.com/yohey03518/e7e9ea1a33727f7e3bee1808a8eb08ed<br /> <br /> 不過經過將table內容放上alert語法實測後,發現並無問題:<br /> <br /> <img class="alignnone wp-image-1940" src="https://yohey66.files.wordpress.com/2018/12/1.png" alt="1" width="352" height="64" /><br /> <br /> Textbox控制項之資料並不會引發XSS問題(右側為GridView預設會針對資料所帶出的欄位),<br /><br /> 實際在Chrome上檢視原始碼來看(點選右鍵→檢視網頁原始碼,會另開分頁而非開發者工具),<br /> <br /> 發現的確是被encode處理過(Textbox的value做了AttributeEncode):<br /> <br /> <img class="alignnone wp-image-1941" src="https://yohey66.files.wordpress.com/2018/12/2.jpg" alt="2" width="764" height="127" /><br /> <br /> 原因是.NET Framework(此處使用4.5.2)在「部分」的控制項上有自動做encode的機制(.NET Framework 2.0 經實測也有此機制),<br /> <br /> 但像是Label控制項可就沒有此機制了:<br /> <br /> https://gist.github.com/yohey03518/1127c97b62fbc4702aaca496142264ef<br /> <br /> <img class="alignnone wp-image-1942" src="https://yohey66.files.wordpress.com/2018/12/3.jpg" alt="3" width="362" height="107" /><img class="alignnone size-full wp-image-1943" src="https://yohey66.files.wordpress.com/2018/12/4.png" alt="4" width="485" height="76" /><img class="alignnone size-full wp-image-1944" src="https://yohey66.files.wordpress.com/2018/12/5.jpg" alt="5" width="1109" height="260" /><br /> <br /> 至於哪些控制項會自動encode,<br /> <br /> 先前網路上的資料目前已失效,<br /> <br /> 可能在使用時尚需個別測試測試。<br /> <br /> 至於要做HtmlEncode除了如下常用的寫法外<br /> <br /> <img class="alignnone wp-image-1946" src="https://yohey66.files.wordpress.com/2018/12/6-1.png" alt="6" width="567" height="35" /><br /> <br /> 在.NET Framework 4之後有提供了更簡便的寫法(這邊以Label為例):<br /> <br /> <img class="alignnone size-full wp-image-1947" src="https://yohey66.files.wordpress.com/2018/12/7.png" alt="7" width="1143" height="43" /><br /> <br /> 發現有什麼不一樣嗎?<br /> <br /> <img class="alignnone wp-image-1948" src="https://yohey66.files.wordpress.com/2018/12/8.jpg" alt="8" width="345" height="57" /><br /> <br /> 可以用一個半型的冒號(:)來做html encode,<br /> <br /> 實測後也發現的確有做了html encode,<br /> <br /> <img class="alignnone wp-image-1951" src="https://yohey66.files.wordpress.com/2018/12/9-2.jpg" alt="9" width="639" height="132" /><br /> <br /> 此寫法也支援ASP.NET MVC 2 View的寫法。<br /> <br /> 回到了目前常用的Razor語法,<br /> <br /> <img class="alignnone wp-image-1952" src="https://yohey66.files.wordpress.com/2018/12/10.jpg" alt="10" width="649" height="149" /><img class="alignnone wp-image-1953" src="https://yohey66.files.wordpress.com/2018/12/11.jpg" alt="11" width="647" height="139" /><br /> <br /> 預設都是會做encode處理的,<br /> <br /> 至於若真的有需要將Html內容直接印在View上,<br /> <br /> 則可以使用Raw的語法來達成。<br /> <br /> <img class="alignnone wp-image-1954" src="https://yohey66.files.wordpress.com/2018/12/12.png" alt="12" width="500" height="84" /><br /> <br /> 最後,即便框架已經針對XSS做了諸多防範,<br /> <br /> 並不代表源碼檢測無意義也不代表web無XSS風險存在,<br /> <br /> 唯有詳細了解源碼檢測掃出的風險內涵以及框架防範機制並且做實測,<br /> <br /> 才能在處理風險時做出正確的判斷。