Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] BBCode parser dla PHP7
ToTamir
post 13.02.2018, 09:48:11
Post #1





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 10.04.2012

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


Proszę o ocenę kodu pod względem optymalności oraz bezpieczeństwa. Parser miał być prosty i bezpieczny. Udało się cały kod zmieścić w 66 linijkach także dużo sprawdzania nie będzie ;-)
Tutaj znajduje się cały kod wraz z opisem:
https://github.com/ToTamir/BBCode-Parser
Powód edycji: [nospor]: nie pozycjonuj sie tu
Go to the top of the page
+Quote Post
nospor
post 13.02.2018, 10:32:04
Post #2





Grupa: Moderatorzy
Postów: 36 446
Pomógł: 6292
Dołączył: 27.12.2004




Pozwalanie na wrzucenie do bbcode do obrazka dowolnego url usuwa z tej klasy tag "bezpieczna"

Brak klas na elementach ktore generujesz uniemozliwia mi jakiekolwiek ostylowanie tego bbcode

No i testowales w ogole to:
$patterns[] = '/\r\n/';
? Odnosze wrazenie ze nie powinno zadzialac. No i co z sytuacja gdy ktos bedzie mial poprostu tylko znacznik \n ?

No i na koniec bbcode to juz raczej wypada z obiegu. Teraz bardziej przyjaznym dla uzytkownika jest Markdown


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

"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
ToTamir
post 13.02.2018, 10:46:46
Post #3





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 10.04.2012

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


Na co należałoby twoim zdaniem zwrócić uwagę przy filtrowaniu url dla obrazów?
To przejście do nowej lini działa poprawnie, a przypadek z samym znacznikiem \n uwzględnie w najbliższym czasie.
Go to the top of the page
+Quote Post
nospor
post 13.02.2018, 11:12:38
Post #4





Grupa: Moderatorzy
Postów: 36 446
Pomógł: 6292
Dołączył: 27.12.2004




I jeszcze sam kod:

niby piszesz pod php7 i niby funkcja ma zwracac tylko string, ale dajesz
return preg_replace()
Jakbys zajrzal do manuala to bys zobaczyl ze preg_replace moze tez zwrocic cos innego niz string a tym samym narazasz mnie, jako uzytkownika twojej aplikacji, na FATAL ERROR na stronie.

nie array()
a []
krotka notacja juz od dawna jest standardem

no i nie
$ar[] = ....
$ar[] = ...

a:
$ar = [
...
...
]

ps: podobnie z preg_replace_callback ktore moze zwrocic nie string. Warto dbac o takie szczegoly w szczegolnosci ze okreslasz swoja funkcje mianem "bezpiecznej"


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

"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
ToTamir
post 13.02.2018, 11:52:39
Post #5





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 10.04.2012

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


Poprawiłem tablice oraz uwzględniłem same \n .Wygląda to obecnie tak:

  1. function ParseBBCode(string $string): string
  2. {
  3. $string = htmlspecialchars($string, ENT_QUOTES, 'UTF-8', true);
  4.  
  5. $patterns =
  6. [
  7. '/\[ol\][\s\S]+?\[\/ol\]/',
  8. '/\[ul\][\s\S]+?\[\/ul\]/',
  9. '/\[table\][\s\S]+?\[\/table\]/'
  10. ];
  11.  
  12. $string = preg_replace_callback($patterns, function($matches){return preg_replace('/\s+/', ' ',$matches[0]);}, $string);
  13.  
  14. $patterns =
  15. [
  16. '/\[b\](.*?)\[\/b\]/',
  17. '/\[i\](.*?)\[\/i\]/',
  18. '/\[u\](.*?)\[\/u\]/',
  19. '/\[s\](.*?)\[\/s\]/',
  20. '/\[j\](.*?)\[\/j\]/',
  21. '/\[size=([\d.]+)\](.*?)\[\/size\]/',
  22. '/\[color=(([a-z]+)|(#[0-f]{6}?)|(rgb\(\d{1,3}?\,\d{1,3}?\,\d{1,3}?\)))\](.*?)\[\/color\]/',
  23. '/\[center\](.*?)\[\/center\]/',
  24. '/\[left\](.*?)\[\/left\]/',
  25. '/\[right\](.*?)\[\/right\]/',
  26. '/\[quote=(.*?)\](.*?)\[\/quote\]/',
  27. '/\[quote\](.*?)\[\/quote\]/',
  28. '/\[url=(.*?)\](.*?)\[\/url\]/',
  29. '/\[img=(.*?) alt=(.*?)\]/',
  30. '/\[youtube=(.*?)\]/',
  31. '/\[li\](.*?)\[\/li\]/',
  32. '/\[td\](.*?)\[\/td\]/',
  33. '/\[ol\](.*?)\[\/ol\]/',
  34. '/\[ul\](.*?)\[\/ul\]/',
  35. '/\[table\](.*?)\[\/table\]/',
  36. '/\[tr\](.*?)\[\/tr\]/',
  37. '/\[th\](.*?)\[\/th\]/',
  38. '/\[code\]/',
  39. '/\[\/code\]/',
  40. '/\r\n/',
  41. '/\n/'
  42. ];
  43.  
  44. $replacements =
  45. [
  46. '<strong>$1</strong>',
  47. '<em>$1</em>',
  48. '<span style="text-decoration:underline;">$1</span>',
  49. '<del>$1</del>',
  50. '<span style="text-align:justify;text-justify:inter-word;">$1</span>',
  51. '<span style="font-size:$1rem;">$2</span>',
  52. '<span style="color:$1;">$5</span>',
  53. '<div style="text-align:center;">$1</div>',
  54. '<div style="text-align:left;">$1</div>',
  55. '<div style="text-align:right;">$1</div>',
  56. '<blockquote><strong>$1:</strong><br>$2</blockquote>',
  57. '<blockquote>$1</blockquote>',
  58. '<a href="$1">$2</a>',
  59. '<img src="$1" alt="$2">',
  60. '<iframe src="https://www.youtube-nocookie.com/embed/$1" allow="autoplay; encrypted-media" allowfullscreen></iframe>',
  61. '<li>$1</li>',
  62. '<td>$1</td>',
  63. '<ol>$1</ol>',
  64. '<ul>$1</ul>',
  65. '<table>$1</table>',
  66. '<tr>$1</tr>',
  67. '<th>$1</th>',
  68. '<code>',
  69. '</code>',
  70. '<br>',
  71. '<br>'
  72. ];
  73.  
  74. return preg_replace($patterns, $replacements, $string);
  75. }


Co do funkcji preg_replace() oraz preg_replace_callback() nie do końca się zgodzę. To prawda, że funkcje te mogą zwrócić inny typ danych, ale dzieje się tak tylko w przypadku błędu. Błąd może wystąpić tylko i wyłącznie w dwóch przypadkach:
1. zmienna przekazywana do tych funkcji jest innego typu niż array lub string,
2. pattern lub replacement są przekazane do funkcji z błędem.
Możliwość pojawienia się błędu numer 2 została wyeliminowana przez sprawdzenie wyniku wykonania kodu, natomiast możliwość pojawienia się błędu numer 1 została wyeliminowana przez wymuszenie w funkcji typu string dla parametru $string.
A więc jedyna możliwość pojawienia się FATAL ERROR pomijając przekroczenie pamięci czy czasu wykonywania to przekazanie do funkcji zmiennej innego typu niż string. Jeżeli "programista" nie sprawdza typów danych przed przekazywaniem ich do funkcji to raczej nie będzie to jedyny FATAL ERROR w jego programie.

Chyba że się mylę? I dodatkowo drugi raz proszę o podpowiedź, na co zwrócić uwagę przy filtrowaniu url dla obrazów.
Go to the top of the page
+Quote Post
nospor
post 13.02.2018, 12:06:51
Post #6





Grupa: Moderatorzy
Postów: 36 446
Pomógł: 6292
Dołączył: 27.12.2004




Ale naprawde taki problem zamiast
return preg_replace($patterns, $replacements, $string);
dac
return (string)preg_replace($patterns, $replacements, $string);

questionmark.gif
I juz kod jest zabezpieczony. Tobie sie teraz wydaje ze ten NULL nie wystapi nigdy, moze i slusznie, ale nie jestes w stanie przewidziec co sie stanie u kogos za rok. Ja po "paru" latach programowaniu wiem ze po jakims czasie w skrypcie potrafia sie pojawic nieoczekiwane bledy. Naprawde wiec jest takim duzym narzutem danie rzutowanie na string, tak na wszelki wypadek? No nie jest. Skoro funkcja ma zwracac string to niech zwraca string na 100% zawsze.

Co do obrazow to co ja ci poradze... No sprawdzaj czy to obraz czy nie smile.gif Moze przez to bedzie dzialac to dluzej ale na pewno bedzie bezpieczniej.
Od biedy mozesz patrzec na rozszerzenie ale w dzisiejszych czasach to juz dawno nie jest wyznacznikiem.


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

"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
trzczy
post 13.02.2018, 12:58:54
Post #7





Grupa: Zarejestrowani
Postów: 460
Pomógł: 49
Dołączył: 5.06.2011

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


Siemanko! Czemu nie ma testów jednostkowych?
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: 19.04.2024 - 12:37