2013-04-25 41 views
2

我对PHP相当陌生,正在使用几个_GET变量来确定页面布局/ Web服务数据以及页面上的其他逻辑。我不存储数据或写入任何类型的数据库。我应该使用什么样的消毒方法?我应该如何清理仅在页面上使用的_GET变量?

例如,一个变种我使用的是这样的:?

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

这是怎么回事但如果该查询字符串有学期=集,而不是空白的,然后我用“术语”替换它并将查询字符串按原样传递给Web服务URL(Web服务使用术语变量,但术语变量干扰wordpress并重定向到该术语的帖子页面(WP中的标记/类别),因此我通过WP作为学期,然后只是改变它的网络服务电话的期限

所以在这种情况下,我没有做任何与_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]."/"); 

Ed它:我已经阅读了很多弹出的类似问题,但他们大都指的是以某种其他方式使用数据,例如插入数据库。

+1

'视图=“);警报(” XSS'就大功告成了 – Gumbo 2013-04-25 15:53:58

+0

@Gumbo它似乎没有工作 - 这可能PHP自动改变? ('''); alert('click');' – tsdexter 2013-04-25 17:36:24

+0

或者使用'jQuery'('#'); alert('click');或者使用' ('XSS'); jQuery('#'以'jQuery('#'); alert('XSS'); jQuery('#' ).trigger('click');'这也只是抛出JS错误 - 我似乎无法得到它接受报价,因为与HTML实体,百分之实体或直接引号字符..我知道我仍然需要消毒但PHP会自动处理报价? – tsdexter 2013-04-25 17:39:37

回答

2

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

+0

感谢更多有用的答案,然后上面的评论。我试过你的建议,我没有JS警报......但我知道,无论如何我需要消毒。我会看看这篇文章,谢谢。 – tsdexter 2013-04-25 17:05:26

+0

我的错误,我试图在旧版本的页面没有视图变种。在新版本中,它将'变成',它仍然会打断JS,并在控制台中引发JS错误。 '未捕获的错误:语法错误,无法识别的表达式:#hacked');警报( '你好'); jQuery('#page_one'):'jQuery('#hacked \'); alert(\'hello \'); jQuery('#page_one')。trigger('click');' – tsdexter 2013-04-25 17:12:04

+0

它看起来像你正在逃避上面的单引号,我也没有看到你的网站或测试我的代码,它只是一个可能的攻击的例子 – doublesharp 2013-04-25 17:35:44