我应该如何清理仅在页面上使用的_GET变量?

时间:2013-04-25 15:13:29

标签: php wordpress security sanitization

我对PHP很新,我使用几个_GET变量来确定页面布局/ Web服务数据以及页面上的其他一些逻辑。我没有存储数据或写入任何类型的数据库。我应该使用什么样的消毒方法?

例如,我正在使用的一个var是这样的:

$querystring = $_SERVER['QUERY_STRING'];
if(isset($_GET['semester']) && $_GET['semester'] != ''){
  $listxml = simplexml_load_file("http://path/to/webservice/?".str_replace('semester','term',$querystring));

如果查询字符串具有?semester = set而不是空白,那么我将其替换为'term'并将查询字符串传递给Web服务URL(Web服务使用术语变量但是术语变量干扰wordpress并重定向到该术语的帖子页面(WP中的标签/类别),所以我将其作为学期传递给WP,然后将其更改为术语以进行Web服务调用。

所以在这种情况下,我没有对_GET做任何事情,除了将其传递给Web服务Web服务用查询字符串做的事情不在我的手中,但是我应该以任何方式“准备”它为他们?

-

我也有类似的案例:

$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]."/" );

编辑:我已经阅读了许多建议的类似问题,但它们主要是指以其他方式使用数据,例如插入数据库。

1 个答案:

答案 0 :(得分:3)

您应该始终清理输入参数。即使您没有在数据库中使用它们,您仍然容易受到跨站点脚本/ 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请求。

最终,您执行的清理类型取决于您使用输入的上下文。在此示例中,您可能希望确保例如转义单引号,但适当的可能在实现之间有所不同。

关于消毒输入的好文章:http://coding.smashingmagazine.com/2011/01/11/keeping-web-users-safe-by-sanitizing-input-data/