Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wielokrotny cudzysłów, apostrof
Forum PHP.pl > Forum > PHP
sianx
Witam,
nie wiem jak właściwie zatytułować mój problem, ale mam nadzieję, że rozwinięcie wszystko wyjaśni.
Mianowicie utworzyłem system dodawania tekstu za pomocą pól tekstowych <textarea>. Owy tekst normalnie jest przesyłany metodą POST, lecz problem pojawia się gdy interpreter php otrzymuje polecenie dodania ww. tekstu do bazy danych MySQL:

  1. $tekst = $_POST['tekst'];
  2.  
  3. $dodaj = @mysql_query("INSERT INTO moja_baza SET tresc=\"$tekst\"");
  4.  
  5. if($dodaj) echo "Dziękujemy za dodanie tekstu.";
  6. else echo "Błąd! ";
  7.  


W takim przypadku, jeżeli do formularza wpisze się cudzysłów zostaje przerwany kod i pojawia się "Błąd!", co rozumiem, gdyż interpreter może wtedy uznać zmienną $tekst za zamknięcie funkcji mysql. Jednakże zastanawiam się jak wyeliminować taką niedogodność. Nie chciałbym użytkownikom mojej strony kazać wpisywać w formularz \" zamiast normalnego cudzysłowu.
Próbowałem już zamienić cudzysłowy na apostrofy, ale wtedy automatycznie występuje niemożność wpisywania apostrofu w formularzu.

Czy jest jakaś możliwość, aby udostępnić w tej sytuacji swobodne wpisywanie cudzysłowów oraz apostrofów?

Pozdrawiam
DiH
Tak, użyj: htmlspecialchars();
http://php.net/manual/en/function.htmlspecialchars.php

Dodatkowo, powinieneś, a nawet musisz użyć: mysql_real_escape_string() http://php.net/manual/en/function.mysql-re...cape-string.php
altruista2
  1. $tekst = str_replace(Array("'","\\"), Array(' & rsquo ;','& #92 ;'), $tekst);
  2. $dodaj = @mysql_query("INSERT INTO moja_baza SET tresc='$tekst'");


Z tego : "' & rsquo ;','& #92 ;'" - usuń spacje, bo nie moge coś na forum tego wstawić.
DiH
@up Twój kod nadal pozwala na położenie zarówno mysql, jak i php poprzez zwykłe """

' - czyli apostrof zapisany jako encja to &apos; a nie & rsquo;
" - zapisujemy jako & quot;
R4D3K
  1. #
  2. $tekst = $_POST['tekst'];
  3. #
  4.  
  5. #
  6. $dodaj = @mysql_query('INSERT INTO moja_baza SET tresc='.htmlentities($tekst));
  7. #
  8.  
  9. #
  10. if($dodaj) echo "Dziękujemy za dodanie tekstu.";
  11. #
  12. else echo "Błąd! ";

Dodawanie \ jest spowodowane włączeniem magic_quotes, jeśli masz ten mechanizm włączony nie musisz używać mysql_real_escape_string (bo jego użycie spowoduje ododanie \ do " a pożniej jeszcze magic_quotes to zrobi).
Zamiast tego wpisz tak jak ci napisałem wtedy htmlenties zamieni znaki takie jak <,>," itp na encje czyli &lt; a przeglądarka gdy otrzyma taki kod poprostu wyświetli odpowiadająca im encje a nie wykona polecenia, dodatkowo do bazy danych zapisz się kod z encjami.
thek
No to na starcie niech sprawdzi czy magic-qoutes włączone czy nie winksmiley.jpg get_magic_quotes_runtime i get_magic_quotes_gpc i od tego uzależnia mysql_real_escape_string. O ile w przypadku textarea problemu nie będzie, to jednak już input type="text" zrobi jazdę, bo realescape robi znaki ucieczki przed znakami, a nazwy w input przechodzą jako value i dostaniesz value="Nazwa w \"takich\" apostrofach" co wysypie Ci wyświetlanie tego. W kodzie strony będziesz wszystko widział, ale w inpucie obetnie Ci wszystko za " lub ' a jedyna metodą na ominięcie tego jest zakombinowanie z htmlentities i html_entities_decode. Sam przed chwilą ten sam problem miałem podczas walidacji formularza. Do bazy szło OK wszystko bezpiecznie, ale wyświetlenie przy Edycji lub podczas poprawiania błędów niestety było tym obarczone.
sianx
Dziękuję bardzo za pomoc. winksmiley.jpg

Jak się okazało najprostszą oraz najkrótszą metodą (dla mnie) jest zastosowanie funkcji htmlspecialchars(); poleconej przez DiHa.

Próbowałem również stosować htmlentities, jednakże po użyciu owej funkcji, mimo wyeliminowania problemu wielokrotnego cudzysłowu, niepoprawnie były wyświetlane polskie znaki (krzaczki). To tyle tytułem podsumowania.
Jeszcze raz dziękuję i pozdrawiam serdecznie biggrin.gif
peku33
jeżeli chcesz dodawać dane z post do zapytania powienieneś je zabezpieczyć przed mysql_injection.

strin mysql_real_escape_string($string, [$connection id]);

patrz: twoje zapytanie to:

INSERT INTO komentarze VALUES('$_POST["tekst"]');

A teraz ktoś ci wpisze w POST:

'); DELETE * from komentarze; INSERT INTO komentarze VALUES('

Z tego powstanie:

INSERT INTO komentarze VALUES(''); DELETE * from komentarze; INSERT INTO komentarze VALUES('');

Czyli raczej not nice.

Użycie tej funckcji zamieni ' na \'. Dzięki temu nie będzie dało się wykonać dowolnego polecenia w SQL
sianx
Dziękuję, że poruszyłeś temat SQL Injection. smile.gif

Poczytałem trochę więcej o samych atakach, jak również o funkcji mysql_real_escape_string, jednakże nie jestem pewien czy dobrze zrozumiałem owe treści. Dlatego też chciałbym się dowiedzieć czy zastosowanie "transformacji":
  1. $tekst = $_POST['tekst'];
  2.  
  3. $tekst2 = mysql_real_escape_string($tekst);
  4.  
  5. $dodaj = @mysql_query("INSERT INTO moja_baza SET tresc=\"$tekst2\"");


zapewni wysoki stopień bezpieczeństwa w stosunku do ataków SQL Injection ?
DiH
Ja używam przykładu z http://php.net/manual/en/function.mysql-re...cape-string.php, czyli na początku każdego skryptu php wstawiam:
  1. foreach ($_POST as $key => $value) {
  2. $_POST[$key] = mysql_real_escape_string($value);
  3. }
  4.  
  5. //This stops SQL Injection in GET vars
  6. foreach ($_GET as $key => $value) {
  7. $_GET[$key] = mysql_real_escape_string($value);
  8. }

Do tego wyłączyć raportowanie błędów i będzie prawie bezpiecznie.
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-2025 Invision Power Services, Inc.