Как я должен санировать переменные 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 2

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/