API - metoda PUT - aktualizacja pola - problem - hash

0

Cześć,
C#, NetCore 3.1 - opis problemu:
Na szybko, aby Was nie zanudzać - has'huję bCrypt'em łańcuch znaków (nazwijmy go hasłem - aby było prościej) - następnie chcę zaktualizować pole w tablicy w bazie danych dla konkretnego użytkownika - czasem jednak występują problemy - zwracanym błędem jest System.Net.HttpStatusCode.NotFound (co jest dosyć dziwne) - poniżej testowa funkcja:

public async Task UpdatePasswordUser(string new_password, string username)
    {
        if (!string.IsNullOrEmpty(token))
        {
            client.DefaultRequestHeaders.Remove("Authorization");
            client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
        }

        var data = JsonConvert.SerializeObject(new Table_test { Password = new_password });
        var response_table = await client.PutAsync(_baseUrl + "/api/table_test/changepassword-" + new_password + "-" + username, new StringContent(data, Encoding.UTF8, "application/json"));
        if (!response_table.IsSuccessStatusCode)
        {
            if (response_table.StatusCode == System.Net.HttpStatusCode.Unauthorized)
                MessageBox.Show("Error, Code : " + response_table.StatusCode);

            MessageBox.Show("Error with update field, Code : " + response_table.StatusCode);
        }
    }

Po stronie API:

 [Authorize]
    [HttpPut]
    [Route("changepassword-{new_password}-{username}")]
    public async Task<IActionResult> ChangePassword(string new_password, string username)
    {
        return await Task.Run(() =>
        {
            using (var c = new MySqlConnection(con_sql.MySQL))
            {
                var sql = @"UPDATE table_test SET password = @password WHERE user = @user";
                var query = c.Query<Models.Table_test>(sql, new { Password = new_password, User = username }, commandTimeout: 10);
                return Ok(query);
            }
        });
    }

Powiedzmy, że przykładowym hasłem będzie : test444 - za każdym razem ten hash oczywiście finalnie wygląda inaczej - i dziwnym jest, że raz dla tego samego wprowadzanego rekordu (test444) metoda PUT przebiega prawidłowo i aktualizacja pola jest OK - a innym razem nie, mimo, że nadal pierwotnym wyrazem jest hasło : test444

Dowolne pomysły lub sugestie? Bardzo dziękuję i pozdrawiam.

Stworzyłem wątek ponieważ pomyślałem, że ktoś może mieć podobny problem - w razie jeśli podobna tematyka istnieje - to przepraszam i proszę o przekierowanie.

1

jako że z jakiegoś powodu hash hasła i username wrzucasz w url, to czy przypadkiem ten hash nie zawiera jakichś znaczków, które są inaczej interpretowane niż np. abc? i dlatego występuje to czasem, bo po prostu nie zawsze się one wlosowują w ten hash.

jakiś przykładowy bcryptowy hash znalazłem:

$2a$05$bvIG6Nmid91Mu9RcmmWZfO5HJIMCT8riNW0hEp8f6/FuA2/mHZFpe

i tam jest /, co według mnie może/jest interpretowane jako no... rozdzielacz

2.2. Reserved Characters

URIs include components and subcomponents that are delimited by
characters in the "reserved" set. These characters are called
"reserved" because they may (or may not) be defined as delimiters by
the generic syntax, by each scheme-specific syntax, or by the
implementation-specific syntax of a URI's dereferencing algorithm.
If data for a URI component would conflict with a reserved
character's purpose as a delimiter, then the conflicting data must be
percent-encoded before the URI is formed.

gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"

Uniform Resource Identifier (URI): Generic Syntax

Nie możesz tego przesłać w request body zamiast url? tak chyba nawet byłoby bezpiecznie, bo się w historii przeglądarki nie zapisze.

0

Wygląda na to, że masz rację - podasz przykład uwzględniając moje funkcje w temacie jakbyś to zrobił fachowo?

4

Ja zmieniłbym atrybut i sygnaturę na

[Route("changepassword")]
public async Task<IActionResult> ChangePassword(ChangePasswordModel data)

oraz dodał klase

public class ChangePasswordModel
{
	public string UserName { get; set; }
	public string Password { get; set; }
}

I właściwie ty chyba miałbyś tylko przerobić wysyłanie

chyba coś takiego

 var data = JsonConvert.SerializeObject(new ChangePasswordModel{ Password = new_password, UserName = username });
 var response_table = await client.PutAsync(_baseUrl + "/api/table_test/changepassword", new StringContent(data, Encoding.UTF8, "application/json"));

generalnie chcesz te dane przesłać w Body zapytania

Model Binding in ASP.NET Core

0

Trochę z innej beczki ale dlaczego hasło jest hashowane po stronie klienta? Prześlij normalnie hasło - komunikacja po https załatwi za Ciebie sprawę bezpieczeństwa

0
boska_cebula napisał(a):

Trochę z innej beczki ale dlaczego hasło jest hashowane po stronie klienta? Prześlij normalnie hasło - komunikacja po https załatwi za Ciebie sprawę bezpieczeństwa

A co sądzisz o hash'owaniu przykładowo bCrypt'em ze współczynnikiem o wartości 6 po stronie klienta dla normalnego użytkownika i przesyłaniu końcowego hash'a https'em?

1

Nie odpowiedziałeś na pytanie: dlaczego hasło jest hashowane po stronie klienta?

1 użytkowników online, w tym zalogowanych: 0, gości: 1