logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

c# ASP - Logowanie na stronie + metoda ExecuteScalar()

kafus6 09 Sie 2014 06:41 1572 8
REKLAMA
  • #1 13863136
    kafus6
    Poziom 14  
    Posty: 162
    Pomógł: 10
    Ocena: 2
    Witajcie.

    Tworze sobie logowanie na stronie. Na razie logowanie nic tak naprawde nie robi oprócz sprawdzania loginu i hasła.
    Cały kod:
    Kod: C#
    Zaloguj się, aby zobaczyć kod


    w web.config
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Problem występuje wtedy i tylko wtedy, gdy podam złe hasło, czyli:

    Jeśli podam zły login - podaje, że jest zły login - to jest ok.
    Jeśli podam dobry login i dobre hasło- jest ok.
    Jeśli podam dobry login i złe hasło- wywala błąd przy linii:
    Kod: C#
    Zaloguj się, aby zobaczyć kod


    An exception of type 'System.NullReferenceException' occurred in WebApplication1.dll but was not handled in user code

    Additional information: Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.

    Czytałem o tym z 200 godzin, ale nie wiem w czym problem:/
    Czy mógłby mi ktoś wskazać rozwiązanie? Już nie mam siły do tego :(

    jeszcze dodaje error z przeglądarki:

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 13863171
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Po pierwsze, co od razu przyprawia mnie o ciarki :) to ta konstrukcja:

    Kod: C#
    Zaloguj się, aby zobaczyć kod



    http://pl.wikipedia.org/wiki/SQL_injection


    Myślę że nic nie znalazł wiec nie ma co dalej robić.
    Sprawdź może najpierw czy sam ExecuteScalar() nie jest NULL
    a potem wykonaj resztę operacji.

    pozdr.
  • REKLAMA
  • #3 13863296
    kafus6
    Poziom 14  
    Posty: 162
    Pomógł: 10
    Ocena: 2
    Możesz mi powiedzieć jak mam to zrobić?
    Siedzę nad tym chyba z 50 lat już i kolejne tyle nic, w tym przypadku, nie zmieni :) Po prostu zaciąłem się i już.

    A co do SQL injection to wiem o tym. Będę to zabezpieczał jak mi w końcu wszystko będzie działać.

    Edit:

    a jak usunąłem ExecuteScalar() i dałem samo:

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    To jest ok, ale hasło jest zawsze błędne... hmm

    Edit2:
    Co do Injection, może być na dobry początek coś takiego?:

    Kod: C#
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #4 13863881
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    No nie to nie chodzi żeby usunąć ExecuteScalar() bo nie odczytasz nic z bazy.

    Chodzi o to że
    passcmd.ExecuteScalar().ToString().Replace(...

    to rząd operacji
    najpierw ExecuteScalar()
    potem ToString()
    następnie Replace(...

    Tak więc skoro ExecuteScalar() jest typu NULL to ToString() już nie moze zadziałać.

    może coś tego typu

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    Zresztą przemyśl ten kod czy dwa razy musisz wysyłać zapytanie do bazy.

    pozdr.
  • REKLAMA
  • #5 13864152
    kafus6
    Poziom 14  
    Posty: 162
    Pomógł: 10
    Ocena: 2
    Aha, teraz to jest bardziej jasne dla mnie :)
    Dzięki za wytłumaczenie- myślałem, że to wykonuje się "na raz", a nie jedno po drugim.

    ok, to zrobiłem coś takiego:

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    Teraz wychodzi na to, że log == null jest zawsze.!


    Edit:

    hm... teraz przeczytałem to co dodałeś o dwóch zapytaniach. Czyli w jedym zapytaniu pytać o log i pas? spróbuje.

    Edit:
    Czyli może być coś takiego?

    SELECT Login, Password FROM LoginTable WHERE Login ='(tutaj textboxlogin)' AND Password = '(tutaj textboxpass)'

    i potem jesli zwroci wartosc inna niż null to jest ok. Tak ?
  • #6 13864390
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Zaraz... tym select'em szukasz wiersza z loginem i odczytasz hasło.
    wiec skoro nie znajdzie wiersza (bedzie null lub DBnull) to "login nieznany".

    Jeżeli odnajdzie to wtedy porównujesz hasło.

    Jeżeli nie rozdzielasz błedu na login i hasło (a tak powinno być)
    to możesz zrobić tak (nie wnikam w SQL injection żeby łatwiej wytłumaczyć):

    Kod: C#
    Zaloguj się, aby zobaczyć kod


    Ogólnie nie rozdziela sie informacji dla usera czy sam login jest ok czy nie
    tylko jako komplet ponieważ to by było ważne info ale głównie dla potencjalnych hackerów np rosyjskich :)

    pozdr.
  • #7 13865474
    kafus6
    Poziom 14  
    Posty: 162
    Pomógł: 10
    Ocena: 2
    O. Tego mi brakowało. Dzięki za sprostowanie moich wypocin :)
  • #8 13867083
    wiesniak
    Poziom 31  
    Posty: 1006
    Pomógł: 231
    Ocena: 52
    Skoro w zapytaniu robisz count, to dlaczego po ExecuteScalar robisz ToString, jeśli metoda zwraca int (jako object)? Niepotrzebnie zamieniasz na string by później znów przerobić na int.
    Proponuję zamienić kod na
    Kod: C#
    Zaloguj się, aby zobaczyć kod

    Zamiast sklejać tekst poczytaj o parametrach - to jest bezpieczniejsze. Jeśli chcesz sklejać, możesz użyć metody HttpServerUtility.HtmlEncode.
  • #9 13868462
    kafus6
    Poziom 14  
    Posty: 162
    Pomógł: 10
    Ocena: 2
    Hmmm... To jest do mnie czy do Pana sivex'a ?:) bo ja już się pogubiłem.

Podsumowanie tematu

✨ Użytkownik pracuje nad implementacją logowania na stronie internetowej w C# z użyciem ASP.NET. W kodzie pojawia się problem z metodą ExecuteScalar(), która nie zwraca oczekiwanych wyników. Uczestnicy dyskusji zwracają uwagę na ryzyko SQL injection związane z nieodpowiednim formatowaniem zapytań SQL. Sugerują, aby najpierw sprawdzić, czy wynik ExecuteScalar() jest NULL, zanim przeprowadzi się dalsze operacje. Proponują również, aby zamiast konstruować zapytania SQL w sposób niebezpieczny, używać parametrów w zapytaniach, co zwiększa bezpieczeństwo aplikacji. Wskazują na konieczność rozdzielenia logiki sprawdzania loginu i hasła oraz na poprawne przetwarzanie wyników zapytań.
Wygenerowane przez model językowy.
REKLAMA