Как я должен санировать переменные GET, которые используются только на странице?
Я довольно новичок в PHP и использую пару переменных _GET для определения макета страницы/данных веб-сервиса и некоторой другой логики на странице. Я не храню данные и не записываю их в какую-либо базу данных. Какую дезинфекцию я должен использовать для этого?
Например, один var, который я использую, выглядит так:
$querystring = $_SERVER['QUERY_STRING'];
if(isset($_GET['semester']) && $_GET['semester'] != ''){
$listxml = simplexml_load_file("http://path/to/webservice/?".str_replace('semester','term',$querystring));
Что происходит, если строка запроса имеет значение ?семестр= set и не пустой, то я заменяю его на 'term' и передаю через строку запроса, как есть в веб URL сервиса (веб-сервис использует переменную термина, но переменная термина мешает wordpress и перенаправляет на страницу сообщений для этого "термина" (тег/категория в WP), поэтому я передаю его через WP как семестр, а затем просто изменяю его на термин для вызова веб-сервиса.
Таким образом, в этом случае я ничего не делаю с _GET, кроме передачи его как есть веб-службе то, что веб-служба делает с querystring, находится вне моих рук, но должен ли я "подготовить" его каким-либо образом для они?
--
У меня также есть случаи, подобные этому:
$display = '';
if (isset($_GET['display'])) {
$display = $_GET['display']; //set sort via querystring
} else {
$display = 'interest'; //set to default by interest
}
Позже:
<div id='byalphabet' class='<?php global $display; if($display != 'alphabet'){echo 'hide';} ?>'>
И
<div id="byinterest" class="<?php global $display; if($display != 'interest'){echo 'hide';} ?>">
--
Также используется для некоторых динамических javascript:
$view = '';
if (isset($_GET['view'])) {
$view = $_GET['view']; //set view via querystring
}
Позже:
<script>
<?php if ($view != ''){ $view = str_replace('/','',$view); ?>
jQuery('#<?php echo $view; ?>').trigger('click'); //activate view option accordion pane
jQuery('html,body').animate({'scrollTop':jQuery('#<?php echo $view; ?>').offset().top - 50},500); //scrollTo view
</script>
--
Другие случаи включают поиск в массиве значения _GET array_search($_GET['major'], $slugs);
и перенаправление страницы с помощью:
$parts = explode('/',$_SERVER['REQUEST_URI']);
Header( "HTTP/1.1 301 Moved Permanently" ); //SEO friendly redirect
Header( "Location: http://www.site.ca/programs/outline/".$parts[3]."/" );
Edit: я прочитал много предложенных подобных вопросов, которые возникли, но они в основном относятся к использованию данных каким-то другим способом, таким как вставка в БД.
1 ответ:
Вы всегда должны санировать входные параметры. Даже если вы не используете их в базе данных, вы все равно уязвимы для межсайтовых сценариев/атак XSS.
<?php $view = $_GET['view'] ?> <script>jQuery('#<?php echo $view; ?>').trigger('click');</script>
Например, учитывая приведенный выше код, все нормально, если
?view=page_one
, потому что ваш JavaScript выглядит какjQuery('#page_one').trigger('click');
.Но что делать, если ваша строка запроса
?view=hacked%27)%3B%20alert(document.cookies)%3B%20jQuery(%27%23page_one
- Теперь ваш javascript выглядит следующим образом на странице:jQuery('#hacked'); alert(document.cookies); jQuery('#page_one').trigger('click');
В конечном счете тип дезинфекции, которую вы выполняете, зависит от контекста, в котором вы используете входные данные. В этом примере вы можете убедиться, что вы избегаете одиночных кавычек, например, но то, что подходит, может отличаться между реализациями.
alert()
может быть запросом AJAX для отправки токенов auth и т. д. различный сервер.Хорошая статья о дезинфекции входных данных здесь: http://coding.smashingmagazine.com/2011/01/11/keeping-web-users-safe-by-sanitizing-input-data/