Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Konwerter HTML do BBCode i BBCode do HTML
northwest
post
Post #1





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


Witam serdecznie,
Poszukuję funkcji do bezpiecznego zapisu/odczytu danych w bazie MySQL.
Użytkownicy mojej strony mają edytorek HTML i zapisują swoje dane w MySQL.
Poszukuję funkcji do bezpiecznego zapisu i odczytu tych danych do MySQL (z usunięciem niebezpiecznych tagów/js'ów itp).


Mógłbym prosić o podesłanie takich skryptów?


Bardzo proszę o pomoc,
Northwest
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




A co to ma do bazy danych? Poprostu albo escapuj dane przed wlozeniem, albo uzywaj bindowania jesli korzystasz z mysqli lub PDO i po sprawie.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
northwest
post
Post #3





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


używam takie coś:
  1. function baza_zapis2($string) {
  2. $string = preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', "", $string);
  3. $string = htmlspecialchars($string, ENT_COMPAT, 'UTF-8');
  4. return $string;
  5. }
  6.  
  7. // funkcja odczytujące dane w bezpiecznej formie (ulepszona wersja)
  8. function baza_odczyt2($string) {
  9. $string = htmlspecialchars_decode($string, ENT_COMPAT);
  10. return $string;
  11. }



I potem za pomocą PDO zapisuję do bazy....

Czy to bezpieczne rozwiązanie?smile.gif
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Z tematu wynika ze chcesz zabezpieczyc poprawne wlozenie danych do bazy. Po raz kolejny ci mowie, ze wystarczy ze uzyjesz bindowania w PDO i nic wiecej nie musisz robic.

Jesli chcesz strone zabezpieczac przed np. XSS to mozesz przed wyswietleniem danych uzyc htmlspecialchars i juz. Wszystko zalezy co chcesz osiagnac.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
northwest
post
Post #5





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


W PDO robię zapis w takiej formie:


  1. $stmt = $db->prepare("select COUNT(bf_id) AS ile from uzytkownicy WHERE login =:login;");
  2. $stmt->bindValue(':login', baza_zapis($_POST["login"]), PDO::PARAM_STR);
  3. $stmt->execute();
  4.  
  5.  
  6. $stmt = $db->prepare("INSERT INTO uzytkownicy (login, haslo,typusera, opis) VALUES (:login, :haslo, :typusera, :opis);");
  7. $stmt->bindValue(':login', baza_zapis($_POST['login']), PDO::PARAM_STR);
  8. $stmt->bindValue(':haslo', baza_zapis($_POST['haslo']), PDO::PARAM_STR);
  9. $stmt->bindValue(':typusera', 1, PDO::PARAM_INT);
  10. $stmt->bindValue(':opis', baza_zapis($_POST['opis']), PDO::PARAM_STR);
  11. $stmt->execute();
  12.  


i zastanawiam się czy istnieje jakieś jeszcze niebezpieczeństwo?

W funkcji zapisującej usuwam JS, do tego to PDO i zamiana HTML ... Coś jeszcze powinienem zrobić?


Wyczytałem gdzieś że opisy itp powinno zamieniać się na BBCode przed zapisem....

Ten post edytował northwest 28.09.2015, 13:15:01
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Zacznij prosze czytac ze zrozumieniem co sie do CIebie pisze. Powtarzam, tym razem postaraj sie skupic :/

By zapisac poprawnie i bezpiecznie dane do bazy, wystarczy ze uzyjesz binowania w PDO. Nic wiecej nie musisz robic. Nie musisz pozbawiac hasla znakow specjalnych. Po to ludzie wymyslają w haslach znaki specjalne by one tam byly i by jakis nadgorliwy poczatkujacy programista ich im nie kasowal....
Nie wspomne juz o tym, ze hasla w bazie nie powinny byc zapisane w jawnej postaci a w postaci hasha.

Zas zabezpieczenia danych wyswietlanych wprowadzanych przez usera to zupelnie inna bajka. Jak chcesz sie zabepieczyc przed XSS, czyli w skrocie rzecz mowiac, przed wykonaniem zlosliwego kodu js podanego przez usera, wystarczy ze przed wyswietleniem danych uzyjesz HTMLSPECIALCHARS. Przed wyswietleniem, a nie przed zapisem do bazy...

Co do bbcode to user ma pisac w bbcode a nie ty masz zamieniac na bbcode.... Ty przed wyswietleniem masz bbcode zamienic na normalny html.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
viking
post
Post #7





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Pod względem wydajnościowym może być lepiej trzymać treść oryginalną i sparsowaną w bazie. Bez sensu jest zatrudniać przed każdym wyświetleniem parser bbcode/markdown/textile/whatever do wygenerowania treści.


--------------------
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@viking tak, ale to juz kolejna dodatkowa kwestia. Najpierw niech autor opanuje podstawy.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
northwest
post
Post #9





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


OK, dziękuję bardzo za poradę smile.gif

Mam jeszcze jedno pytanie,
Mam takie coś:

  1.  
  2. $base_host = "localhost"; // host mysql
  3. $base_login = "root"; // użytkownik bazy danych
  4. $base_haslo = "xxx"; // hasło bazy danych
  5. $base_baza = "bazq"; // nazwa bazy danych
  6.  
  7. function login_check($mysqli) {
  8. //// jakaś funkcja
  9. if ($stmt = $db->prepare("SELECT password FROM user WHERE gt_id = :user_id LIMIT 1;")) {
  10. $stmt->bindValue(':user_id', $user_id);
  11. $stmt->execute();
  12. }
  13.  
  14. }


Dlaczego wewnątrz tej funkcji nie widać tych zmiennych $base_ questionmark.gif

Ten post edytował northwest 28.09.2015, 14:00:59
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




manual -> zasieg zmiennych.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
northwest
post
Post #11





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


tak, ale dane do połącznenia z pdo=>mysql mam poza funkcją....


Przepraszam,ale zły przykład napisałem powyżej:
  1. $base_host = "localhost"; // host mysql
  2. $base_login = "root"; // użytkownik bazy danych
  3. $base_haslo = "xxx"; // hasło bazy danych
  4. $base_baza = "baza"; // nazwa bazy danych
  5.  
  6.  
  7. $options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
  8. try
  9. {
  10. $db = new PDO("mysql:host={$base_host};dbname={$base_baza};charset=utf8", $base_login, $base_haslo, $options);
  11. }
  12. catch(PDOException $ex)
  13. {
  14. die("Failed to connect to the database: " . $ex->getMessage());
  15. }
  16. $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  17. $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
  18.  
  19.  
  20.  
  21. function login($email, $password, $mysqli) {
  22.  
  23.  
  24.  
  25. if ($stmt = $db->prepare("SELECT gt_id, username, password, salt FROM cms_admin WHERE username = :username LIMIT 1;")) {
  26. $stmt->bindValue(':username', $email);
  27. $stmt->execute();
  28.  
  29. }}
  30.  
  31.  



I już tutaj, wewnątrz funkcji nie widzi tego połączenia sad.gif


otrzymuję błąd: Fatal error: Call to a member function prepare() on null in db.php on line 78



Ten post edytował northwest 28.09.2015, 14:18:51
Go to the top of the page
+Quote Post
nospor
post
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Toc wyraznie napisalem:
manual -> zasieg zmiennych

http://php.net/manual/en/language.variables.scope.php


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
northwest
post
Post #13





Grupa: Zarejestrowani
Postów: 788
Pomógł: 1
Dołączył: 17.09.2004

Ostrzeżenie: (10%)
X----


OK, dziękuję smile.gif

Mam jeszcze pytanie - czy takie rozwiązanie jest bezpieczne:


  1. $stmtdwdw = $db->prepare("INSERT INTO komentarze (idusera, tresc) VALUES (:idusera, :tresc);");
  2. $stmtdwdw->bindValue(':idusera', $_SESSION['id_usera'], PDO::PARAM_INT);
  3. $stmtdwdw->bindValue(':tresc', $_POST['txt'], PDO::PARAM_STR);
  4. $stmtdwdw->execute();


Chodzi mi o trzymanie ID użytkownika w sesji?
Go to the top of the page
+Quote Post
nospor
post
Post #14





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




No tak, cos w sesji musisz trzymac by wiedziec kto zalogowany


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 06:34