
2024年最佳天氣API
在下一個屏幕上,輸入項目名稱和位置以及解決方案的名稱:
在下一個屏幕上,只需接受所有默認設置并單擊“創建”。Visual Studio 完成應用程序創建后,執行快速冒煙測試。按 F5,您的默認瀏覽器將打開并顯示如下內容:
下一步是添加模型。在 Visual Studio 中,轉到解決方案資源管理器,右鍵單擊“模型”文件夾,然后轉到“添加和類”。輸入Todo作為類的名稱并確認。創建類后,將其內容替換為以下內容:
namespace XSSNetDemo.Models
{
public class Todo
{
public int Id { get; set; }
public string? Description { get; set; }
public DateOnly DueDate { get; set; }
}
}
因此,此示例應用程序將是一個老生常談的話題:待辦事項列表。上面的類表示待辦事項,具有 ID、描述和截止日期。下一步,我們要為我們的應用程序創建控制器和視圖。
轉到解決方案資源管理器并右鍵單擊文件夾控制器。 然后,轉到添加>新腳手架項。
在下一個屏幕上,選擇帶有視圖的 MVC 控制器,使用 Entity Framework,然后單擊添加:
然后系統會提示您輸入一些重要的信息。
至于其他選項,保留其默認值。單擊“添加”完成。
在運行應用程序之前,讓我們做一些小改動,以便我們可以使用內存數據庫。轉到Program.cs類并刪除以下行:
builder.Services.AddDbContext<XSSNetDemoContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("XSSNetDemoContext")));
將其替換為以下內容:
builder.Services.AddDbContext<XSSNetDemoContext>(options => options.UseInMemoryDatabase("todos"));
最后,轉到“工具”菜單,然后轉到“NuGet 包管理器” > “包管理器控制臺”。粘貼并運行以下命令:
Install-Package Microsoft.EntityFrameworkCore.InMemory
您終于可以運行該應用程序了。在 Visual Studio 中按 F5。您的瀏覽器將打開該應用程序。轉到地址欄并將 /Todos 附加到地址。您應該看到類似以下內容:
單擊“新建”,您將進入一個新屏幕,您可以在其中添加新的待辦事項:
現在,讓我們測試一下是否可以將一些腳本注入此應用。在截止日期行中,輸入任何您想要的內容。但對于描述,請嘗試輸入一些腳本,例如<script>alert(‘hey!’);</script>,然后單擊“創建”按鈕。
幸運的是,結果并不盡如人意:
如您所見,應用程序只是顯示“惡意”腳本,而不是執行它。這怎么可能呢?好吧,如果您使用瀏覽器顯示頁面底層 HTML 代碼的功能,您將看到類似以下內容:
<tbody>
<tr>
<td>
<script>alert('oi');</script>
</td>
<td>
05/02/2022 12:17:00
</td>
<td>
<a href="/Todos/Edit/1">Edit</a> |
<a href="/Todos/Details/1">Details</a> |
<a href="/Todos/Delete/1">Delete</a>
</td>
</tr>
</tbody>
上面的代碼顯示 <script> 標記中的小于號和大于號被替換為那些看起來很奇怪的代碼。這些是 HTML 實體,這意味著 HTML 標記已編碼。這樣,頁面就可以安全地顯示它們,而不是運行它們。
出于好奇,假設您希望讓應用程序容易受到 XSS 攻擊。您會怎么做?
轉到Views文件夾。 找到Todos文件夾,然后打開名為Index.cshtml的文件。
在文件內,找到以下行:
@Html.DisplayFor(modelItem => item.Description)
將其替換為以下內容:
@Html.Raw(item.Description)
正如代碼所示,現在我們顯示的是未經任何編碼的原始 HTML。為了說明清楚,這是糟糕的做法!不要在現實生活中這樣做。
現在,再次運行該應用程序,再次注入惡意腳本作為描述,您將看到以下內容:
在我們開始之前,這里還有另一個不該做的事情的例子。返回TodosController.cs類并添加以下方法:
public string Introduce(string id)
{
return $"Hello, my name is {id}.";
}
現在,再次運行該應用程序。然后,將 /Todos/Introduce/<YOUR-NAME> 附加到地址,確保使用您的真實姓名。您將看到類似以下內容:
現在你知道該怎么做了。用腳本替換名稱,然后它就會被執行。你該如何解決這個問題?很簡單:
public string Introduce(string id)
{
return HtmlEncoder.Default.Encode($"Hello, my name is {id}.");
}
確保將using System.Text.Encodings.Web;添加到您的使用列表中,這樣就大功告成了。現在代碼正確地對輸入的 HTML 代碼進行編碼,避免了腳本的解釋和執行。
XSS 是一種可能造成毀滅性影響的安全威脅,但避免它相對簡單。您必須記住永遠不要相信用戶輸入,并且始終對要顯示的 HTML 代碼進行編碼。
此外,如果您完全不允許用戶提交 HTML(例如,出于富文本格式目的),那么這會有所幫助。如果有需要,請選擇 markdown 之類的格式,這樣您可以在顯示時安全地將其轉換為 HTML。
文章來源:.NET XSS: Examples and Prevention