Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Konwerter HTML do BBCode i BBCode do HTML
Forum PHP.pl > Forum > Gotowe rozwiązania
northwest
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
nospor
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.
northwest
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
nospor
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.
northwest
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....
nospor
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.
viking
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.
nospor
@viking tak, ale to juz kolejna dodatkowa kwestia. Najpierw niech autor opanuje podstawy.
northwest
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
nospor
manual -> zasieg zmiennych.
northwest
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

nospor
Toc wyraznie napisalem:
manual -> zasieg zmiennych

http://php.net/manual/en/language.variables.scope.php
northwest
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?
nospor
No tak, cos w sesji musisz trzymac by wiedziec kto zalogowany
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.