Здравствуйте. Поставили задачу написать функцию, которая бы защищала сайт от XSS и SSI атак. Предложенные варианты простой обработки через функции htmlentities и ей подобными не подходят, потому что "нужно что-то посерьёзнее". Есть у кого идеи?
PHP: private function clearVars($source) { if (is_array($source)) { foreach ($source as $key => $value) { $source[$key] = $this->clearVars($value); } return $source; } if (is_object($source)) { foreach ($source as $property => $value) { $source->{$property} = $this->clearVars($value); } return $source; } return is_string($source) ? htmlspecialchars($source, ENT_QUOTES) : $source; }
Просто я делаю вот так, но мне private красным подчеркивает и выводит "Parse error: syntax error, unexpected token "private", expecting end" PHP: <?php $source = array("foo", "bar", "hallo", "world"); private function clearVars($source) { if (is_array($source)) { foreach ($source as $key => $value) { $source[$key] = $this->clearVars($value); } return $source; } if (is_object($source)) { foreach ($source as $property => $value) { $source->{$property} = $this->clearVars($value); } return $source; } return is_string($source) ? htmlspecialchars($source, ENT_QUOTES) : $source; } clearVars($source); ?>
PHP: function clearVars($source) { if (is_array($source)) { foreach ($source as $key => $value) { $source[$key] = clearVars($value); } return $source; } if (is_object($source)) { foreach ($source as $property => $value) { $source->{$property} = clearVars($value); } return $source; } return is_string($source) ? htmlspecialchars($source, ENT_QUOTES) : $source; } $xssArray = [ 'a' => '<script>alert("Я XSS")</script>', 'b' => '<script>alert("Я вторая XSS")</script>', 'c' => [ 'd' => '<script>alert("Я третья XSS")</script>' ] ]; var_dump($xssArray); //echo $xssArray['a']; // XSS выполнится //echo $xssArray['b']; // XSS выполнится //echo $xssArray['c']['d']; // XSS выполнится $clearingArray = clearVars($xssArray); var_dump($clearingArray); echo $clearingArray['a']; // XSS не выполнится echo $clearingArray['b']; // XSS не выполнится echo $clearingArray['c']['d']; // XSS не выполнится extract($clearingArray); echo $a; // XSS не выполнится echo $b; // XSS не выполнится echo $c['d']; // XSS не выполнится
/?a=<script>alert("Я XSS")</script>&b=<script>alert("Я вторая XSS")</script> PHP: extract(clearVars($_GET)); echo $a; // XSS не выполнится echo $b; // XSS не выполнится // можно проще $a = filter_input(INPUT_GET, 'a', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $b = filter_input(INPUT_GET, 'b', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
я изучил документацию, но не нашёл информацию о том, как использовать процедурные выражения в качестве фильтра? Мол, санитайзить, если соответствует кодировке <.*>