Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] BBCode parser dla PHP7
Forum PHP.pl > Forum > Przedszkole
ToTamir
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
nospor
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
ToTamir
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.
nospor
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"
ToTamir
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.
nospor
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.
trzczy
Siemanko! Czemu nie ma testów jednostkowych?
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.