2

我对 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= 而不是空白,那么我将其替换为 'term' 并按原样通过查询字符串传递给 Web 服务 URL(Web 服务使用 term 变量但 term 变量会干扰使用 wordpress 并重定向到该“术语”(WP 中的标签/类别)的帖子页面,因此我将其作为学期传递给 WP,然后将其更改为用于 Web 服务调用的术语。

因此,在这种情况下,除了将它按原样传递给 Web 服务之外,我没有对 _GET 做任何事情,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]."/" );

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

4

1 回答 1

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/

于 2013-04-25T16:58:13.943 回答