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

标签 php wordpress security sanitization

我对 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/

相关文章:

javascript - WordPress子主题排队脚本

security - 用户名和密码可以通过 URL 参数通过 HTTPS 安全发送吗?

php 文件不回显远程服务器上 mysql 表的查询,但适用于本地 XAMMP mariaDB

javascript - 如何在页面滚动的标题中实现最小化 Logo ?

javascript - 将 PhantomJs 与 PHP 循环结合使用

php - 在 WooCommerce 存档页面上获取并显示产品自定义字段

java - 如何防止我的客户经常使用演示 Java 程序?

mysql - 使用本地 MySQL 数据库保护 Web 服务器

php - Laravel加Ajax实现搜索栏

php - WordPress图片上传时间错误: Post-processing of the image failed