|
14 | 14 | use DB; |
15 | 15 | use ZipArchive; |
16 | 16 | use File; |
| 17 | +use DOMDocument; |
17 | 18 |
|
18 | 19 | use App\Models\User; |
19 | 20 | use App\Models\Button; |
@@ -720,8 +721,34 @@ public function editPage(request $request) |
720 | 721 |
|
721 | 722 | $profilePhoto = $request->file('image'); |
722 | 723 | $pageName = $request->littlelink_name; |
723 | | - $pageDescription = strip_tags($request->pageDescription,'<a><p><strong><i><ul><ol><li><blockquote><h2><h3><h4>'); |
724 | | - $pageDescription = preg_replace("/<a([^>]*)>/i", "<a $1 rel=\"noopener noreferrer nofollow\">", $pageDescription); |
| 724 | + $pageDescription = $request->pageDescription; |
| 725 | + |
| 726 | + // Strip HTML tags except for allowed tags |
| 727 | + $pageDescription = strip_tags($pageDescription, '<a><p><strong><i><ul><ol><li><blockquote><h2><h3><h4>'); |
| 728 | + |
| 729 | + // Sanitize attributes and remove JavaScript code |
| 730 | + if (!empty($pageDescription)) { |
| 731 | + $document = new DOMDocument(); |
| 732 | + $document->loadHTML($pageDescription, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); |
| 733 | + |
| 734 | + // Find all elements that have attributes |
| 735 | + $elements = $document->getElementsByTagName('*'); |
| 736 | + foreach ($elements as $element) { |
| 737 | + // Check each attribute of the element |
| 738 | + foreach ($element->attributes as $attribute) { |
| 739 | + $attributeName = $attribute->nodeName; |
| 740 | + |
| 741 | + // Remove attributes that contain "on" followed by an event name |
| 742 | + if (strpos($attributeName, 'on') === 0) { |
| 743 | + $element->removeAttribute($attributeName); |
| 744 | + } |
| 745 | + } |
| 746 | + } |
| 747 | + |
| 748 | + // Get the sanitized HTML back |
| 749 | + $pageDescription = $document->saveHTML(); |
| 750 | + } |
| 751 | + |
725 | 752 | $name = $request->name; |
726 | 753 | $checkmark = $request->checkmark; |
727 | 754 | $sharebtn = $request->sharebtn; |
|
0 commit comments