zapytanie do bazy na SQL server w stringu

zapytanie do bazy na SQL server w stringu
JF
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 3 lata
  • Postów:20
0

Mam taki problem, w warunku 'where' jest coś takiego: x.Dzien > '2015-11-27 00:00:00'.
'Dzien' to kolumna tablicy typu datetime, łańcuch z datą wystawia kontrolka na kliencie, problem w tym, że SQL Server 2012 w czasie wykonywania zwraca błąd o przekroczeniu wartości poza zakres - odczytuje łańcuch jako YYYY-dd-mm, a nie YYYY-mm-dd. Wiem, bo sprawdzałem, jak obie wartości po roku są < 13 to zapytanie działa.
Co się dzieje, gdzieś rozjechały się formaty daty?
Pozdrawiam,
Jan

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
0

jak nie chcesz mieć takich problemów to NIGDY nie podawaj daty jako stringa a jako datę. To jest jedyne akceptowalne rozwiązanie. BTW poczytaj o czymś takim jak parametry zapytania albo jeszcze lepiej co to jest ORM


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
JF
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 3 lata
  • Postów:20
0

" and a.CreationDate < '" + dateTimePicker1.Value.Date + "' "
" and a.CreationDate < '" + dateTimePicker1.Value + "' "

Tak to wygląda w kodzie, oba warianty działają dając taki string:
"2015-11-25 00:00:00" co na SQL Serverze 2012 interpretowane jest jako 25 miesiąc, 11 dzień.

JF
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 3 lata
  • Postów:20
0

'jak nie chcesz mieć takich problemów to NIGDY nie podawaj daty jako stringa a jako datę. To jest jedyne akceptowalne rozwiązanie.'
Jak widzisz, nie podaję daty, jako stringa, tylko z metody komponentu 'dateTimePicker'.
A i tak się zapytanie pieprzy.

edytowany 1x, ostatnio: JanF
woolfik
nie wiem w jakim języku to piszesz ale sądząc po apostrofach i + to wynika z tego, że pomimo iż przekazałeś z komponentu date to do zapytania i tak sklejasz string. Gdybyś użył parametru jak ci @abrakadaber pisał to byś tego problemu nie miał.
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

@JanF a teraz wyobraź sobie że ktoś ustawia to dateTimePicker1.Value.Date w DOM na przykład na

Kopiuj
'2015-11-27 00:00:00' union select password from users where '1'='1

albo cokolwiek innego sobie tym unionem wyciąga ;] NIGDY nie sklejaj inputu od usera w stringa do SQL. To się nazywa SQL Injection.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Marcin.Miga
UNION SELECT we WHERE?? Bez sensu... :)
Shalom
@Marcin.Miga https://www.youtube.com/watch?v=6dicaYJpL70 ;] union kończy where i robi drugie zapytanie którego wynik jest doklejony do pierwszego. Patrz: http://sqlfiddle.com/#!9/ebee1/1
Marcin.Miga
Ech, szkoda dyskusji na to... To co napisałeś zadziała w mniej niż 1% zapytań. Trzeba wziąć pod uwagę ilość nawiasów wcześniej, czy dany argument nie jest parametrem funkcji itp. A nawet jak już to przejdzie (oczywiście nie wyświetlam bezpośrednio komunikatów z bazy, by nie ułatwić) to jeszcze dla UNION ilość pól w wyniku musi się zgadzać...
Shalom
@Marcin.Miga nie rozśmieszaj mnie, przecież nikt tego nie będzie robił ręcznie tylko odpali sqlmap i wyciągnie w pół godziny wszystko co sie da z tej bazy przez tą dziurę. Polecam do poczytania https://github.com/p4-team/ctf/tree/master/2015-11-20-dctffinals/web200 ;)
JF
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 3 lata
  • Postów:20
0

Dzięki za udział.
Potrzebuję coś na szybko, stąd ADO.Net - jeśli będzie zainteresowanie i czas od strony czynników, to (i tu się zgadzam) to LINQ, (czas to czas potrzebny na naukę).
W tym momencie chciałbym zrozumieć co się dzieje, qrna, co wpływa na takie a nie inne zachowanie serwera?!
Kodowanie DB ustawione jest na Latin1 - może to?

MY
  • Rejestracja:ponad 9 lat
  • Ostatnio:9 dni
  • Postów:1083
0
Shalom napisał(a):

albo cokolwiek innego sobie tym unionem wyciąga ;] NIGDY nie sklejaj inputu od usera w stringa do SQL. To się nazywa SQL Injection.
Bez przesady można (a nawet trzeba) się przed tym zabezpieczyć. Przecież bardzo często trzeba wyszukać coś w bazie po tym co wpisze user :)

JanF napisał(a):

W tym momencie chciałbym zrozumieć co się dzieje, qrna, co wpływa na takie a nie inne zachowanie serwera?!
To czemu nie chcesz formatować daty tak jak chce tego serwer bazodanowy? Żaden problem sklejając string formatować datę do postaci YYYY-dd-mm.

Ewentualnie poszukaj może serwer obsługuje jeszcze inne formaty np. YYYY/mm/dd. Tu już musisz niestety sięgnąć do dokumentacji serwera.

Zobacz pozostały 1 komentarz
MY
@Shalom fakt, to prawda. Takich mechanizmów powinno się używać, jednak ja u siebie czasem nie mogę użyć tego ponieważ jakiś warunek będzie włączony, czasem nie. Czasem muszę zbudować klauzulę where na podstawie tego co sobie user wybierze w oknie gdzie sam sobie dokłada pola oraz operatory. Wtedy nie mam za bardzo wyjścia, tylko sklejam poszczególne warunki i mam. Oczywiście usuwam wszelkie elementy mogące powodować SQL Injection.
Shalom
@Mr.YaHooo usuwam wszelkie elementy mogące powodować SQL Injection chcesz się o to założyć? :P
MY
@Shalom w sumie nawet jakby coś się przedostało, to system korzysta z usera na bazie o ograniczonych uprawnieniach. Np. user ma zablokowaną np. możliwość dropnięcia tabeli. Komponenty których używam do łączenia z bazą danych mają możliwość wykonania tylko 1 zapytania, więc pisanie po średniku nic nie da, bo zostanie wyświetlony błąd jaki zwróci baza. Po drugie raczej pani Basia z księgowości nie będzie próbowała takich rzeczy robić :P
Shalom
@Mr.YaHooo to tobie też polecam lekturę https://github.com/p4-team/ctf/tree/master/2015-11-20-dctffinals/web200 ;) Zobaczysz jak wyciąga sie dane z bazy nawet jak nic ci nie zwraca i jak zwraca błędy, a także jak można położyć serwer mając ograniczone uprawnienia ;)
MY
@Shalom dzięki, bo akurat o bezpieczeństwie to jednak muszę się poduczyć ;)
PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 9 godzin
  • Postów:3873
0

Na szybko:

" and a.CreationDate < convert(datetime,'" + dateTimePicker1.Value.Date + "',121) "
" and a.CreationDate < convert(datetime,'" + dateTimePicker1.Value + "',121) "

JF
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 3 lata
  • Postów:20
0

Bardzo dziękuję wszystkim za podzielenie się wiedzą!
Przyznam się, że zaniepokoiła mnie możliwość ataku 'SQL Injection', nigdy o tym nie słyszałem, będę musiał poczytać o tym.

0

Ale jeśli już musisz, to możesz spróbować uzyskać:

x.Dzien > '20151127'
Przynajmniej nie będzie się czepiał formatu daty.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.