我对 PHP 相当陌生,正在使用几个 _GET 变量来确定页面布局/Web 服务数据和页面上的一些其他逻辑。我不存储数据或写入任何类型的数据库。我应该使用哪种 sanitizer 方法?
例如,我正在使用的一个变量是这样的:
$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 服务调用的术语。
因此,在这种情况下,除了将 _GET 按原样传递给 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]."/" );
编辑:我已经阅读了许多建议的类似问题,但它们大多是指以其他方式使用数据,例如插入数据库。
最佳答案
您应该始终清理输入参数。即使您不在数据库中使用它们,您仍然容易受到跨站点脚本/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 请求,将身份验证 token 等发送到不同的服务器。
最终,您执行的清理类型取决于您使用输入的上下文。在此示例中,您可能希望确保转义单引号,但适当的内容可能因实现而异。
关于清理输入的好文章:http://coding.smashingmagazine.com/2011/01/11/keeping-web-users-safe-by-sanitizing-input-data/
关于php - 我应该如何清理仅在页面上使用的 _GET 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16218516/