xss vulnerabilities fixes

This commit is contained in:
Hamid Reza Mohammadi 2026-09-25 17:55:27 +03:30
parent af75cc18d9
commit 221cdf9f30
3 changed files with 13 additions and 7 deletions

View File

@ -274,7 +274,7 @@ namespace GanjooRazor.Areas.Admin.Pages
ModifyModel.HtmlText = await htmlRes.Content.ReadAsStringAsync();
LastMessage = $"متن تولیدی دریافت شد. لطفا آن را کپی کنید و سپس <a href=\"/Admin/ModifyPage?id={Request.Query["id"]}\">اینجا</a> کلیک کنید و آن را درج نمایید.";
LastMessage = $"متن تولیدی دریافت شد. لطفا آن را کپی کنید و سپس <a href=\"/Admin/ModifyPage?id={System.Net.WebUtility.HtmlEncode(Request.Query["id"])}\">اینجا</a> کلیک کنید و آن را درج نمایید.";
}

View File

@ -197,7 +197,7 @@ namespace GanjooRazor.Areas.Admin.Pages
_memoryCache.Remove(cacheKey2);
}
LastResult = $"ویرایش انجام شد. <a role=\"button\" href=\"/Admin/Poet?id={Request.Query["id"]}\" class=\"actionlink\">برگشت به صفحهٔ ویرایش سخنور</a>";
LastResult = $"ویرایش انجام شد. <a role=\"button\" href=\"/Admin/Poet?id={System.Net.WebUtility.HtmlEncode(Request.Query["id"])}\" class=\"actionlink\">برگشت به صفحهٔ ویرایش سخنور</a>";
await PreparePoet();
@ -235,7 +235,7 @@ namespace GanjooRazor.Areas.Admin.Pages
return Page();
}
LastResult = $"تصویر بارگذاری شد. <a role=\"button\" href=\"/Admin/Poet?id={Request.Query["id"]}\" class=\"actionlink\">برگشت به صفحهٔ ویرایش سخنور</a>";
LastResult = $"تصویر بارگذاری شد. <a role=\"button\" href=\"/Admin/Poet?id={System.Net.WebUtility.HtmlEncode(Request.Query["id"])}\" class=\"actionlink\">برگشت به صفحهٔ ویرایش سخنور</a>";
}
}
@ -271,7 +271,7 @@ namespace GanjooRazor.Areas.Admin.Pages
return Page();
}
LastResult = $"پایگاه داده‌ها بارگذاری شد. <a role=\"button\" href=\"/Admin/Poet?id={Request.Query["id"]}\" class=\"actionlink\">برگشت به صفحهٔ ویرایش سخنور</a>";
LastResult = $"پایگاه داده‌ها بارگذاری شد. <a role=\"button\" href=\"/Admin/Poet?id={System.Net.WebUtility.HtmlEncode(Request.Query["id"])}\" class=\"actionlink\">برگشت به صفحهٔ ویرایش سخنور</a>";
}
}
@ -307,7 +307,7 @@ namespace GanjooRazor.Areas.Admin.Pages
return Page();
}
LastResult = $"پایگاه داده‌های اصلاحی بارگذاری شد. <a role=\"button\" href=\"/Admin/Poet?id={Request.Query["id"]}\" class=\"actionlink\">برگشت به صفحهٔ ویرایش سخنور</a>";
LastResult = $"پایگاه داده‌های اصلاحی بارگذاری شد. <a role=\"button\" href=\"/Admin/Poet?id={System.Net.WebUtility.HtmlEncode(Request.Query["id"])}\" class=\"actionlink\">برگشت به صفحهٔ ویرایش سخنور</a>";
}
}

View File

@ -77,7 +77,12 @@ else
@if (Model.StatsAtTop && Model.QueryIsSingleWord)
{
<div class="sitem">
<a href="javascript:loadWordCountsByCat('@Model.Query', @Model.PoetId, @Model.CatId, false)" id="load-word-counts" class="pagebutton comments-link">
@* Model.Query is the untrusted "s" search-query string. It must never be
interpolated into a javascript: href/onclick - HTML-encoding alone does
not stop it breaking out of the JS string literal there, because the
browser HTML-decodes the attribute before handing it to the JS engine.
Passing it through a data-* attribute keeps it as inert text. *@
<a href="javascript:void(0)" data-search-query="@Model.Query" data-poet-id="@Model.PoetId" data-cat-id="@Model.CatId" onclick="loadWordCountsByCat(this.dataset.searchQuery, this.dataset.poetId, this.dataset.catId, false); return false;" id="load-word-counts" class="pagebutton comments-link">
مشاهدهٔ بسامد واژگان «@Model.QueryDin» به تفکیک بخش
</a>
@ -135,7 +140,8 @@ else
@if (!Model.StatsAtTop && Model.QueryIsSingleWord)
{
<div class="sitem">
<a href="javascript:loadWordCountsByCat('@Model.Query', @Model.PoetId, @Model.CatId, false)" id="load-word-counts" class="pagebutton comments-link">
@* See the matching comment above for why this is a data-* attribute, not a javascript: href. *@
<a href="javascript:void(0)" data-search-query="@Model.Query" data-poet-id="@Model.PoetId" data-cat-id="@Model.CatId" onclick="loadWordCountsByCat(this.dataset.searchQuery, this.dataset.poetId, this.dataset.catId, false); return false;" id="load-word-counts" class="pagebutton comments-link">
مشاهدهٔ بسامد واژگان «@Model.QueryDin» به تفکیک بخش
</a>