У меня есть простой сайт страниц ASP.NET Core Razor, на котором пользователь вводит номер комнаты, и он выводит результат, доступен он или нет.
После завершения разработки он был отправлен команде безопасности, и мы получили следующее сообщение:
Проблема существует на стороне POST: когда мы манипулируем запросом, мы можем передавать специальные символы (необработанные) или закодированные URL-адреса.
Это часть Index.cshtml.
<input class = "form-control" asp-for = "InputRoomNo" pattern = "[a-zA-Z0-9]+" title = "Only charcters and letters please" minlength = "3" maxlength = "5">
Это большая часть Index.cshtml.cs
public class IndexModel : PageModel
{
public readonly IConfiguration config;
[BindProperty(SupportsGet = false)]
public string InputRoomNo { get; set; }
public Room roomInfo = null;
public string conn;
public IndexModel(IConfiguration Configuration)
{
config = Configuration;
}
public void OnPost()
{
conn = config.GetConnectionString("ConnectionString");
string b = $"{InputRoomNo}";
b = Request.Form["inputRoomNo"];
roomInfo = Search($"{InputRoomNo}");
}
public void OnGet()
{
}
Поиск — это метод, который открывает соединение с базой данных и выполняет выбор.
Что не так и как можно решить проблему безопасности?
ОБНОВЛЕНИЕ: После применения предложенного ответа я получил такой ответ: Проблема все еще существует при обработке запроса, специальные символы (включая пробел (%20) проходят) Его можно обойти, используя кодировку URL-адреса или перехватив запрос и отправив специальные символы длиной до 5 символов.
Я новичок в мире веб-разработки, есть какие-нибудь предложения?
Прочтите некоторые документы по проверке ввода данных пользователем.
По моему мнению, вам также необходимо установить аннотации данных для модели «InputRoomNo», чтобы сервер уловил неожиданный символ. Специальное промежуточное программное обеспечение для проверки возможности HTTP-запроса.





Похоже, вы путаете понятия, поэтому вам может помочь упрощение.
InputRoomNo в качестве BindProperty, что означает, что метод OnPost может прочитать значение оттуда.Request.Form, поскольку вы можете ссылаться на значение вашего объекта недвижимости.bВаш код можно упростить следующим образом (если b не используется в коде, который не был включен в ваше сообщение):
public void OnPost()
{
roomInfo = Search(InputRoomNo);
}
Получая доступ к значению непосредственно из общедоступного источника BindProperty, вы обходите потенциальные манипуляции с данными формы запроса, но не забудьте должным образом очистить и выполнить необходимую проверку данных перед их использованием.
ПС. Поскольку это метод Search, который открывает соединение с базой данных для выбора данных, вам также не нужно соединение в OnPost.
Фактически, вы можете абстрагировать это до именованного обработчика страницы, и в этом случае ваша функция поиска изменит имя с Search на OnPostSearch или OnPostSearchAsync, если вы выполняете в ней асинхронные операции.
public async Task OnPostSearchAsync()
{
conn = config.GetConnectionString("ConnectionString");
// Do your search logic here.
roomInfo = ...; // Assign roomInfo to your search results
}
Your form would change:
<form method = "post">
Would become
<form method = "post" asp-page-handler = "Search">
b — это строка b = $"{InputRoomNo}", но как продезинфицировать, чтобы предотвратить то, что они сказали?
Когда вы напрямую ссылаетесь на свойство, как я показал, в этом нет необходимости. Ядро Asp.net создано для предотвращения вмешательства злоумышленников описанным способом.
Спасибо, отправлю и посмотрю на реакцию.
Похоже, вы не выполняете никакой очистки ввода по запросу. Вам необходимо проверить данные на клиенте И на вашем API, чтобы убедиться, что получаемые вами данные заслуживают доверия.