Zabezpieczenie systemu komentarzy.

Tutaj dyskutujemy o PHP oraz zgłaszamy i rozwiązujemy problemy dotyczące tego języka.
tymek
Początkujący
Początkujący
Posty: 21
Dołączył(a): poniedziałek, 14 kwietnia 2014, 10:19

Zabezpieczenie systemu komentarzy.

Post przez tymek »

Napisałem swój własny system komentarzy oparty o ajax ($post), php oraz PDO. Zastanawiam się jak zabezpieczyć te komentarze. Ajaxa zabezpieczyłem tokenem, który się zmienia przy każdym odświeżeniu strony i jest ściśle powiązany z danymi które wysyłam przez POST, oraz userem który w tej chwili pisze komentarz(wysłanie linku z gotowym formularzem zakończy się fiaskiem). Każda zmiana istotnych danych kończy się przerwaniem - exit(). Do wysłania do bazy danych użyłem PDO i funkcji prepare(). Zastanawiam się jeszcze tylko nad samym komentarzem, probowałem zabezpieczyć to np tak:

Code: Zaznacz cały

trim(strip_tags(mysql_real_escape_string($string)));
Jest jednak mały problem, ponieważ funkcja mysql_real_escape_string zaznacza mi wszystkie znaki typu entery i zamienia na jakieś swoje odpowiedniki "/n". Przez co komentarz się 'psuje'.
Próbowałem również napisać odpowiedni kod za pomocą funkcji preg np.

Code: Zaznacz cały

(preg_match('@^([a-z0-9\!\@\#\$\%\^\&\*\?\(\)\-\_\-\+\,\.\"\'\[\]]+)$@iu', $intiger )) 
Jednak coś mi się wydaje że zwłaszcza z tymi cudzysłowami to nie zadziała.

Co mógłbym zrobić?
I pytanie nr 2 muszę jakoś zabezpieczyć komentarz przed wysłaniem go ajaxem? Jeżeli tak to jakich funkcji użyć w javascript?
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Zabezpieczenie systemu komentarzy.

Post przez Morfidon »

Pytanie nr 1:

Spróbuj wyciągnąć tak: http://php.net/manual/en/function.stripslashes.php

Jak nie zadziała to możesz zakodować np. jsonem albo base64 komentarz do bazy danych i wyciągnąć go później i rozpakować.

Pytane nr 2:
Cokolwiek co wrzucasz do bazy lub wyciągasz powinieneś zabezpieczyć albo prepared statementami, albo mysqli_real_escape_string etc.
tymek
Początkujący
Początkujący
Posty: 21
Dołączył(a): poniedziałek, 14 kwietnia 2014, 10:19

Re: Zabezpieczenie systemu komentarzy.

Post przez tymek »

No tak, ale to w bazie mam mieć ten komentarz z tymi slashami? Sprawdzałem gdzie indziej w cmsach (Wordpress) nie mieli takich zabezpieczeń. Znaczy się nigdzie nie zauważyłem krzaczków w bazie. Jest sens zabezpieczać entery i cudzysłowia skoro wysyłam to PDO z funkcją prepare?

Co do pytania nr 2. Wiem że do bazy cokolwiek wysyłam muszę zabezpieczyć, ale tam mi chodziło o wysłanie danych przez ajax, czy to może skutkowac jakimś niebezpieczeństwem: )
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Zabezpieczenie systemu komentarzy.

Post przez Morfidon »

1. Ogólnie to jest trudne, ale chodzi oto, że jak ktoś się dorwie do wpisu, który ma coś dziwnego i da radę zadać do niego zapytanie to wtedy się robią problemy. Jak reszta skryptów jest ok to teoretycznie jest bezpiecznie. Ważne jest to, by również sprawdzać to co wyciągasz z bazy.
2. Przecież jak wysyłasz przez ajax to wysyłasz najpierw do skryptu php info, a później z php wysyłasz do bazy danych?
tymek
Początkujący
Początkujący
Posty: 21
Dołączył(a): poniedziałek, 14 kwietnia 2014, 10:19

Re: Zabezpieczenie systemu komentarzy.

Post przez tymek »

Tak zgadza się pierw wysyłam do innego pliku php.

Zależy mi by mieć czystą bazę, a nie jeszcze kombinować i przekonwertowywać tekst. Później będę chciał gdzieś to przenieść, albo zmienić system komentarzy i znowu problem. W sumie tych dziwnych sleshy przy każdym enterze,innym białym znaku i cudzysłowie można by się pozbyć jeżeli usuniemy mozliwość wpisywania takich znaków specjalnych w cudzysłowach? Dobrze myśle?
tymek
Początkujący
Początkujący
Posty: 21
Dołączył(a): poniedziałek, 14 kwietnia 2014, 10:19

Re: Zabezpieczenie systemu komentarzy.

Post przez tymek »

HA! I mam rozwiązanie. Znaczy się ciekawy trop :) wiem czemu tak się dzieje ze zapisuje mi w bazie z tymi sleshami. Ponieważ wcześniej mój kod zapisywałem zwykłymi zapytaniami mysql. Wtedy jak używałem funkcji mysql_real_escape_string wsztsko było cacy. Gdy jednak przepuścilem to przez PDO. On po prostu zapsiał sobie te znaki. Widać wyraźnie że ta funkcja nie powinna być stosowana przez PDO i w zupełnosci powinna nam wystarczyć do tego celu stworzona funckja prepare:PDO gdzies czytałem że przydatne jest $pdo->quote, ale z tego co siię dowiaduje tutaj https://openclassrooms.com/forum/sujet/ ... ring-19722 chyba nie koniecznie potrzebna, jeżeli użyjemy prepare : )

Dobrze myśle?

Na wszelki wypadek napiszę preg_replace który usunie wszytskei znaki typu =, ||, !, między cudzysłowami.
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Zabezpieczenie systemu komentarzy.

Post przez Morfidon »

Możesz tak zrobić. Albo po prostu przy wyciąganiu z bazy używasz strip_slashes, albo kodujesz jakimś koderem tekst wpisywany do bazy.
Post Reply