XssVulnerabilityTest.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <?php
  2. namespace PhpOffice\PhpSpreadsheetTests\Writer\Html;
  3. use PhpOffice\PhpSpreadsheet\IOFactory;
  4. use PhpOffice\PhpSpreadsheet\RichText\RichText;
  5. use PhpOffice\PhpSpreadsheet\Shared\File;
  6. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  7. use PhpOffice\PhpSpreadsheetTests\Functional;
  8. class XssVulnerabilityTest extends Functional\AbstractFunctional
  9. {
  10. public function providerAcceptableMarkupRichText(): array
  11. {
  12. return [
  13. 'basic text' => ['Hello, I am safely viewing your site', 'Hello, I am safely viewing your site'],
  14. 'link' => ["<a href='Visit Google'>Google is here</a>", '<a href="Visit%20Google">Google is here</a>'],
  15. ];
  16. }
  17. /**
  18. * @dataProvider providerAcceptableMarkupRichText
  19. *
  20. * @param string $safeTextString
  21. * @param string $adjustedTextString
  22. */
  23. public function testMarkupInComment($safeTextString, $adjustedTextString): void
  24. {
  25. $spreadsheet = new Spreadsheet();
  26. $richText = new RichText();
  27. $richText->createText($safeTextString);
  28. $spreadsheet->getActiveSheet()->getCell('A1')->setValue('XSS Test');
  29. $spreadsheet->getActiveSheet()
  30. ->getComment('A1')
  31. ->setText($richText);
  32. $filename = File::temporaryFilename();
  33. $writer = IOFactory::createWriter($spreadsheet, 'Html');
  34. $writer->save($filename);
  35. $verify = file_get_contents($filename);
  36. unlink($filename);
  37. // Ensure that executable js has been stripped from the comments
  38. self::assertStringContainsString($adjustedTextString, $verify);
  39. }
  40. public function providerXssRichText(): array
  41. {
  42. return [
  43. 'script tag' => ["Hello, I am trying to <script>alert('Hack');</script> your site"],
  44. 'javascript tag' => ["<a href='&#x2000;javascript:alert(1)'>CLICK</a>"],
  45. 'with unicode' => ['<a href="\\u0001java\\u0003script:alert(1)">CLICK<a>'],
  46. 'inline css' => ['<li style="list-style-image: url(javascript:alert(0))">'],
  47. 'char value chevron' => ["\x3cscript src=http://www.example.com/malicious-code.js\x3e\x3c/script\x3e"],
  48. ];
  49. }
  50. /**
  51. * @dataProvider providerXssRichText
  52. *
  53. * @param string $xssTextString
  54. */
  55. public function testXssInComment($xssTextString): void
  56. {
  57. $spreadsheet = new Spreadsheet();
  58. $richText = new RichText();
  59. $richText->createText($xssTextString);
  60. $spreadsheet->getActiveSheet()->getCell('A1')->setValue('XSS Test');
  61. $spreadsheet->getActiveSheet()
  62. ->getComment('A1')
  63. ->setText($richText);
  64. $filename = File::temporaryFilename();
  65. $writer = IOFactory::createWriter($spreadsheet, 'Html');
  66. $writer->save($filename);
  67. $verify = file_get_contents($filename);
  68. unlink($filename);
  69. // Ensure that executable js has been stripped from the comments
  70. self::assertStringNotContainsString($xssTextString, $verify);
  71. }
  72. }