‪TYPO3CMS  ‪main
SecurityStatus.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use Psr\Http\Message\ServerRequestInterface;
30 
35 {
39  protected ‪$request;
40 
47  public function ‪getStatus(ServerRequestInterface ‪$request = null): array
48  {
49  $statuses = [
50  'trustedHostsPattern' => $this->‪getTrustedHostsPatternStatus(),
51  'fileDenyPattern' => $this->‪getFileDenyPatternStatus(),
52  'htaccessUpload' => $this->‪getHtaccessUploadStatus(),
53  'exceptionHandler' => $this->‪getExceptionHandlerStatus(),
54  'exportedFiles' => $this->‪getExportedFilesStatus(),
55  ];
56 
57  if (‪$request !== null) {
58  $statuses['encryptedConnectionStatus'] = $this->‪getEncryptedConnectionStatus(‪$request);
59  $lockSslStatus = $this->‪getLockSslStatus(‪$request);
60  if ($lockSslStatus) {
61  $statuses['getLockSslStatus'] = $lockSslStatus;
62  }
63  }
64 
65  return $statuses;
66  }
67 
68  public function ‪getLabel(): string
69  {
70  return 'security';
71  }
72 
76  protected function ‪getEncryptedConnectionStatus(ServerRequestInterface ‪$request): ‪ReportStatus
77  {
78  $value = $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_ok');
79  $message = '';
80  $severity = ContextualFeedbackSeverity::OK;
81 
82  $normalizedParams = ‪$request->getAttribute('normalizedParams');
83 
84  if (!$normalizedParams->isHttps()) {
85  $value = $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_insecure');
86  $severity = ContextualFeedbackSeverity::WARNING;
87  $message = $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_encryptedConnectionStatus_insecure');
88  }
89 
90  return GeneralUtility::makeInstance(ReportStatus::class, $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_encryptedConnectionStatus'), $value, $message, $severity);
91  }
92 
96  protected function ‪getLockSslStatus(ServerRequestInterface ‪$request): ?‪ReportStatus
97  {
98  $normalizedParams = ‪$request->getAttribute('normalizedParams');
99 
100  if ($normalizedParams->isHttps()) {
101  $value = $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_ok');
102  $message = '';
103  $severity = ContextualFeedbackSeverity::OK;
104 
105  if (!‪$GLOBALS['TYPO3_CONF_VARS']['BE']['lockSSL']) {
106  $value = $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_insecure');
107  $message = $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_lockSslStatus_insecure');
108  $severity = ContextualFeedbackSeverity::WARNING;
109  }
110 
111  return GeneralUtility::makeInstance(ReportStatus::class, $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_lockSslStatus'), $value, $message, $severity);
112  }
113 
114  return null;
115  }
116 
123  {
124  $value = $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_ok');
125  $message = '';
126  $severity = ContextualFeedbackSeverity::OK;
127 
128  if (‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['trustedHostsPattern'] === ‪VerifyHostHeader::ENV_TRUSTED_HOSTS_PATTERN_ALLOW_ALL) {
129  $value = $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_insecure');
130  $severity = ContextualFeedbackSeverity::ERROR;
131  $message = $this->‪getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:warning.install_trustedhosts');
132  }
133 
134  return GeneralUtility::makeInstance(ReportStatus::class, $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_trustedHostsPattern'), $value, $message, $severity);
135  }
136 
142  protected function ‪getFileDenyPatternStatus(): ‪ReportStatus
143  {
144  $value = $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_ok');
145  $message = '';
146  $severity = ContextualFeedbackSeverity::OK;
147 
148  $fileAccessCheck = GeneralUtility::makeInstance(FileNameValidator::class);
149  if ($fileAccessCheck->missingImportantPatterns()) {
150  $value = $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_insecure');
151  $severity = ContextualFeedbackSeverity::ERROR;
152  $message = sprintf(
153  $this->‪getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:warning.file_deny_pattern_partsNotPresent'),
154  '<br /><pre>' . htmlspecialchars($fileAccessCheck::DEFAULT_FILE_DENY_PATTERN) . '</pre><br />'
155  );
156  }
157 
158  return GeneralUtility::makeInstance(ReportStatus::class, $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_fileDenyPattern'), $value, $message, $severity);
159  }
160 
167  protected function ‪getHtaccessUploadStatus(): ‪ReportStatus
168  {
169  $value = $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_ok');
170  $message = '';
171  $severity = ContextualFeedbackSeverity::OK;
172 
173  $fileNameAccess = GeneralUtility::makeInstance(FileNameValidator::class);
174  if ($fileNameAccess->customFileDenyPatternConfigured()
175  && $fileNameAccess->isValid('.htaccess')) {
176  $value = $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_insecure');
177  $severity = ContextualFeedbackSeverity::ERROR;
178  $message = $this->‪getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:warning.file_deny_htaccess');
179  }
180 
181  return GeneralUtility::makeInstance(ReportStatus::class, $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_htaccessUploadProtection'), $value, $message, $severity);
182  }
183 
184  protected function ‪getExceptionHandlerStatus(): ‪ReportStatus
185  {
186  $value = $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_ok');
187  $message = '';
188  $severity = ContextualFeedbackSeverity::OK;
189  if (
190  str_contains(‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['productionExceptionHandler'], 'Debug') ||
191  (‪Environment::getContext()->isProduction() && (int)‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['displayErrors'] === 1)
192  ) {
193  $value = $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_insecure');
194  $severity = ContextualFeedbackSeverity::ERROR;
195  $message = $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_exceptionHandler_errorMessage');
196  } elseif ((int)‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['displayErrors'] === 1) {
197  $severity = ContextualFeedbackSeverity::WARNING;
198  $message = $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_exceptionHandler_warningMessage');
199  }
200  return GeneralUtility::makeInstance(ReportStatus::class, $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_exceptionHandler'), $value, $message, $severity);
201  }
202 
203  protected function ‪getExportedFilesStatus(): ‪ReportStatus
204  {
205  $value = $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_ok');
206  $message = '';
207  $severity = ContextualFeedbackSeverity::OK;
208 
209  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_file');
210  $exportedFiles = $queryBuilder
211  ->select('storage', 'identifier')
212  ->from('sys_file')
213  ->where(
214  $queryBuilder->expr()->like(
215  'identifier',
216  $queryBuilder->createNamedParameter('%/_temp_/importexport/%')
217  ),
218  $queryBuilder->expr()->or(
219  $queryBuilder->expr()->like(
220  'identifier',
221  $queryBuilder->createNamedParameter('%.xml')
222  ),
223  $queryBuilder->expr()->like(
224  'identifier',
225  $queryBuilder->createNamedParameter('%.t3d')
226  )
227  ),
228  )
229  ->executeQuery()
230  ->fetchAllAssociative();
231 
232  if (count($exportedFiles) > 0) {
233  $files = [];
234  foreach ($exportedFiles as $exportedFile) {
235  $files[] = '<li>' . htmlspecialchars($exportedFile['storage'] . ':' . $exportedFile['identifier']) . '</li>';
236  }
237 
238  $value = $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_insecure');
239  $severity = ContextualFeedbackSeverity::WARNING;
240  $message = $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_exportedFiles_warningMessage');
241  $message .= '<ul>' . implode(PHP_EOL, $files) . '</ul>';
242  $message .= $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_exportedFiles_warningRecommendation');
243  }
244 
245  return GeneralUtility::makeInstance(ReportStatus::class, $this->‪getLanguageService()->sL('LLL:EXT:reports/Resources/Private/Language/locallang_reports.xlf:status_exportedFiles'), $value, $message, $severity);
246  }
247 
248  protected function ‪getLanguageService(): ‪LanguageService
249  {
250  return ‪$GLOBALS['LANG'];
251  }
252 }
‪TYPO3\CMS\Reports\Report\Status\SecurityStatus\$request
‪ServerRequestInterface $request
Definition: SecurityStatus.php:38
‪TYPO3\CMS\Reports\Report\Status\SecurityStatus\getTrustedHostsPatternStatus
‪ReportStatus getTrustedHostsPatternStatus()
Definition: SecurityStatus.php:121
‪TYPO3\CMS\Reports\Report\Status\SecurityStatus\getLockSslStatus
‪ReportStatus getLockSslStatus(ServerRequestInterface $request)
Definition: SecurityStatus.php:95
‪TYPO3\CMS\Reports\Report\Status\SecurityStatus\getHtaccessUploadStatus
‪ReportStatus getHtaccessUploadStatus()
Definition: SecurityStatus.php:166
‪TYPO3\CMS\Core\Resource\Security\FileNameValidator
Definition: FileNameValidator.php:25
‪TYPO3\CMS\Reports\Report\Status\SecurityStatus\getFileDenyPatternStatus
‪ReportStatus getFileDenyPatternStatus()
Definition: SecurityStatus.php:141
‪TYPO3\CMS\Reports\Report\Status\SecurityStatus\getLanguageService
‪getLanguageService()
Definition: SecurityStatus.php:247
‪TYPO3\CMS\Reports\Report\Status\SecurityStatus\getLabel
‪getLabel()
Definition: SecurityStatus.php:67
‪TYPO3\CMS\Reports\Report\Status\SecurityStatus\getEncryptedConnectionStatus
‪getEncryptedConnectionStatus(ServerRequestInterface $request)
Definition: SecurityStatus.php:75
‪TYPO3\CMS\Reports\Report\Status\SecurityStatus\getStatus
‪ReportStatus[] getStatus(ServerRequestInterface $request=null)
Definition: SecurityStatus.php:46
‪TYPO3\CMS\Core\Type\ContextualFeedbackSeverity
‪ContextualFeedbackSeverity
Definition: ContextualFeedbackSeverity.php:25
‪TYPO3\CMS\Core\Security\ContentSecurityPolicy\Reporting\ReportStatus
‪ReportStatus
Definition: ReportStatus.php:24
‪TYPO3\CMS\Reports\Status
Definition: Status.php:24
‪TYPO3\CMS\Reports\StatusProviderInterface\getStatus
‪Status[] getStatus()
‪TYPO3\CMS\Core\Middleware\VerifyHostHeader\ENV_TRUSTED_HOSTS_PATTERN_ALLOW_ALL
‪const ENV_TRUSTED_HOSTS_PATTERN_ALLOW_ALL
Definition: VerifyHostHeader.php:32
‪TYPO3\CMS\Reports\Report\Status\SecurityStatus\getExceptionHandlerStatus
‪getExceptionHandlerStatus()
Definition: SecurityStatus.php:183
‪TYPO3\CMS\Reports\Report\Status\SecurityStatus
Definition: SecurityStatus.php:35
‪TYPO3\CMS\Reports\Report\Status\SecurityStatus\getExportedFilesStatus
‪getExportedFilesStatus()
Definition: SecurityStatus.php:202
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Core\Middleware\VerifyHostHeader
Definition: VerifyHostHeader.php:31
‪TYPO3\CMS\Reports\Report\Status
Definition: ConfigurationStatus.php:16
‪TYPO3\CMS\Core\Localization\LanguageService
Definition: LanguageService.php:46
‪TYPO3\CMS\Reports\RequestAwareStatusProviderInterface
Definition: RequestAwareStatusProviderInterface.php:26
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:46
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Core\Core\Environment\getContext
‪static getContext()
Definition: Environment.php:128