| Version 6 (modified by , 3 weeks ago) ( diff ) |
|---|
Други теми
Безбедност
Спречување на SQL Injection
Користиме Entity Framework Core (ORM). EF Core автоматски ги параметризира сите LINQ прашања (queries). Ова спречува напаѓачите да вметнат злонамерни SQL команди преку полињата за внес.
- EF Core го третира username како параметар (@p0), а не како извршлив код.
- Ова спречува SQL Injection напади (на пр., ' OR 1=1 --).
public async Task<User> AuthenticateAsync(string username, string password)
{
var user = await _context.Users
.FirstOrDefaultAsync(u => u.Username == username && u.IsActive);
if (user == null)
return null;
bool isHashed = user.Password.StartsWith("$2") && user.Password.Length == 60;
if (isHashed)
{
if (BCrypt.Net.BCrypt.Verify(password, user.Password))
return user;
}
else
{
if (user.Password == password)
{
user.Password = BCrypt.Net.BCrypt.HashPassword(password);
await _context.SaveChangesAsync();
return user;
}
}
return null;
}
Хеширање на лозинки (Заштита на податоци)
Лозинките се зачувуваат како хеш вредности со користење на алгоритмот BCrypt, а не како обичен текст.
public async Task<bool> CreateUserAsync(User user, string password)
{
using var transaction = await _context.Database.BeginTransactionAsync();
try
{
user.Password = BCrypt.Net.BCrypt.HashPassword(password);
_context.Users.Add(user);
await _context.SaveChangesAsync();
await transaction.CommitAsync();
return true;
}
catch
{
await transaction.RollbackAsync();
return false;
}
}
Безбедност на Database Context (Row-Level идентификација)
Го пренесуваме идентитетот на моментално најавениот корисник од Application Layer до Database Layer (PostgreSQL) користејќи Session Variables. Ова и овозможува на базата на податоци да знае кој ја извршува операцијата.
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
{
var username = _httpContextAccessor.HttpContext?.User?.Identity?.Name ?? "system";
await Database.ExecuteSqlRawAsync("SELECT set_config('app.current_user', {0}, false)", new[] { username }, cancellationToken);
return await base.SaveChangesAsync(cancellationToken);
}
Авторизација (Role-Based Access Control)
Го ограничуваме пристапот до Controllers и Actions со користење на атрибутот [Authorize] . Само автентицирани корисници со валидни cookies можат да пристапат до овие ресурси.
- Овој атрибут осигурува дека само најавени корисници можат да пристапат до било која акција во овој контролер.
- Неавтентицираните барања се пренасочуваат кон страницата за најава (Login page).
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace StockMaster.Controllers
{
[Authorize]
public class ReportController : Controller
{
private readonly IReportService _reportService;
public ReportController(IReportService reportService)
{
_reportService = reportService;
}
public IActionResult Index()
{
return View();
}
// ... други акции
}
}
Безбедност на база на податоци базирана на логика (Triggers)
Користиме Database Triggers за да спроведеме безбедносни правила што не можат да бидат заобиколени од апликацијата. Поточно, спречуваме корисник да ја избрише сопствената account за да обезбедиме стабилност на системот и следење на активности.
CREATE OR REPLACE FUNCTION stock_management.prevent_self_delete()
RETURNS TRIGGER AS $$
BEGIN
IF OLD.username = current_setting('app.current_user', true) THEN
RAISE EXCEPTION 'You cannot delete your own account.';
END IF;
RETURN OLD;
END;
$$ LANGUAGE plpgsql;
CREATE OR REPLACE TRIGGER trg_prevent_self_delete
BEFORE DELETE ON stock_management.users
FOR EACH ROW EXECUTE FUNCTION stock_management.prevent_self_delete();
Пеформанси - Индекси
Attachments (4)
- with_index_1.png (26.7 KB ) - added by 3 weeks ago.
- with_index_2.png (48.8 KB ) - added by 3 weeks ago.
- without_index_1.png (34.6 KB ) - added by 3 weeks ago.
- without_index_2.png (32.8 KB ) - added by 3 weeks ago.
Download all attachments as: .zip
