| | 5 | === Спречување на SQL Injection === |
| | 6 | |
| | 7 | Користиме Entity Framework Core (ORM). EF Core автоматски ги параметризира сите LINQ прашања (queries). Ова спречува напаѓачите да вметнат злонамерни SQL команди преку полињата за внес. |
| | 8 | |
| | 9 | * EF Core го третира **username** како параметар (@p0), а не како извршлив код. |
| | 10 | * Ова спречува SQL Injection напади (на пр., ' OR 1=1 --). |
| | 11 | |
| | 12 | {{{ |
| | 13 | public async Task<User> AuthenticateAsync(string username, string password) |
| | 14 | { |
| | 15 | var user = await _context.Users |
| | 16 | .FirstOrDefaultAsync(u => u.Username == username && u.IsActive); |
| | 17 | |
| | 18 | if (user == null) |
| | 19 | return null; |
| | 20 | |
| | 21 | bool isHashed = user.Password.StartsWith("$2") && user.Password.Length == 60; |
| | 22 | |
| | 23 | if (isHashed) |
| | 24 | { |
| | 25 | if (BCrypt.Net.BCrypt.Verify(password, user.Password)) |
| | 26 | return user; |
| | 27 | } |
| | 28 | else |
| | 29 | { |
| | 30 | if (user.Password == password) |
| | 31 | { |
| | 32 | user.Password = BCrypt.Net.BCrypt.HashPassword(password); |
| | 33 | await _context.SaveChangesAsync(); |
| | 34 | |
| | 35 | return user; |
| | 36 | } |
| | 37 | } |
| | 38 | |
| | 39 | return null; |
| | 40 | } |
| | 41 | }}} |