Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wielokrotny cudzysłów, apostrof, Jak użyć trzykrotnie "zagnieżdżonego" cudzysłowu ?
sianx
post 18.02.2010, 00:53:06
Post #1





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 18.02.2010

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


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
Go to the top of the page
+Quote Post
DiH
post 18.02.2010, 01:03:31
Post #2





Grupa: Zarejestrowani
Postów: 251
Pomógł: 34
Dołączył: 7.01.2010

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


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

Ten post edytował DiH 18.02.2010, 01:05:43
Go to the top of the page
+Quote Post
altruista2
post 18.02.2010, 01:13:03
Post #3





Grupa: Zarejestrowani
Postów: 127
Pomógł: 32
Dołączył: 8.02.2010

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


  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ć.

Ten post edytował altruista2 18.02.2010, 01:14:29


--------------------
Jeśli Ci pomogłem kliknij pomógł. W ten sposób temat zaświeci się na żółto i użytkownicy którzy pomagają nie będą musieli niepotrzebnie klikać. Dziękuję.

"Pomaganie"
Go to the top of the page
+Quote Post
DiH
post 18.02.2010, 01:23:59
Post #4





Grupa: Zarejestrowani
Postów: 251
Pomógł: 34
Dołączył: 7.01.2010

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


@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;

Ten post edytował DiH 18.02.2010, 01:28:24
Go to the top of the page
+Quote Post
R4D3K
post 18.02.2010, 09:35:08
Post #5





Grupa: Zarejestrowani
Postów: 144
Pomógł: 12
Dołączył: 16.03.2007

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


  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.
Go to the top of the page
+Quote Post
thek
post 18.02.2010, 10:00:52
Post #6





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
sianx
post 19.02.2010, 13:42:20
Post #7





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 18.02.2010

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


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
Go to the top of the page
+Quote Post
peku33
post 19.02.2010, 21:00:00
Post #8





Grupa: Zarejestrowani
Postów: 65
Pomógł: 5
Dołączył: 22.01.2010

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


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
Go to the top of the page
+Quote Post
sianx
post 21.02.2010, 14:28:00
Post #9





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 18.02.2010

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


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 ?
Go to the top of the page
+Quote Post
DiH
post 21.02.2010, 18:10:07
Post #10





Grupa: Zarejestrowani
Postów: 251
Pomógł: 34
Dołączył: 7.01.2010

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


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.
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 Wersja Lo-Fi Aktualny czas: 10.05.2025 - 06:52