【问题标题】:Do I need to validate uploaded files (PHP) if they are not going to be stored on the server?如果上传的文件不存储在服务器上,我是否需要验证它们?
【发布时间】:2011-03-18 14:17:21
【问题描述】:

我有一个带有选项页面的 wordpress 主题。我已经包含了一个基本的导出/导入选项功能。导出功能允许用户将选项下载到文本 .dat 文件并将它们存储在自己的计算机上。导入选项按钮读取 .dat 文件并覆盖数据库中的当前选项。然后在脚本执行结束时删除该文件(不存储在服务器中)。

没有单独的 uploads.php 文件,一切都发生在一个脚本中(导出、导入等)。

我尝试导入一些 php 文件和其他类型的文件,唯一发生的事情是选项被清除了。但这就是应该发生的事情,导入的文件应该替换数据库中的任何内容。

用户只有在以管理员权限登录 WordPress 仪表板时才能访问此表单。

所以没有必要在这个导入表单上设置广泛的安全功能,是吗?除了,也许我应该用 .sql 文件试试,看看会发生什么?有人可能会创建一个 .sql 文件并清除整个数据库吗?为了安全起见,我应该将 .sql 文件列入黑名单吗?

这是我的导入代码:

   if ( $_GET['page'] == basename(__FILE__) ) {
        if ( 'export' == $_POST['action']) {
        cpress_export();
    }   
    if (isset($_FILES['settings'])){
        if ($_FILES["settings"]["error"] > 0){
            echo "Error: " . $_FILES["settings"]["error"] . "<br />";
          } else{
            $rawdata = file_get_contents($_FILES["settings"]["tmp_name"]);
            $cp_options = unserialize($rawdata);
            update_option('cpress_options', $cp_options);
            header("Location: themes.php?page=options_page.php&import=true");
          }
    }

这是我的导出代码(在同一个文件中):

function cpress_export(){
$settings = get_option('cpress_options');
$file_out = serialize($settings);
header("Cache-Control: public, must-revalidate");
header("Pragma: hack"); 
header("Content-type: text/plain; charset=ISO-8859-1");
header('Content-Disposition: attachment; filename="cpress-options-'.date("Ymd").'.dat"');
echo $file_out;
exit;}

【问题讨论】:

  • 为什么在 cpress_export() 的末尾回显 $file_out?
  • 这是一个导出 - 您必须在标头之后将数据发送给客户端!

标签: php security wordpress import export


【解决方案1】:

我建议的一些改进;

  1. 在插件的开头使用if (!defined('ABSPATH')) die() - 如果恶意用户试图直接加载您的脚本,它将失败,因为没有定义 WordPress 常量 ABSPATH

    李>
  2. 使用WordPress nonces - 这至少会让一个讨厌的人的生活变得更艰难:)

  3. 检查 unserialize() 是否失败(如果失败,结果将是布尔值 false) - 如果序列化数据格式错误(或一开始没有序列化),就会发生这种情况。如果失败,请不要继续更新。

  4. 使用wp_safe_redirect() 而不是header() 进行重定向(事实上,您应该始终在重定向到其他 WP 管理页面时使用此功能 - 否则使用 wp_redirect())。

【讨论】:

  • 非常感谢您的建议!
【解决方案2】:

如果您正在读取文件并将该文件加载到数据库中,那么肯定会有被利用的机会。但是,如果仅对管理员启用此功能,那么我不知道应该付出多少努力来防止 恶意 活动。如果他们是管理员,他们可以做更简单的事情来清除数据库。

作为一般规则,这样做可能值得付出一些努力,这样用户就不会意外搞砸任何事情,但是让您的管理员用户不做恶意事情既不值得付出努力,也不符合“管理员”的想法“ 角色。这就像在 Linux 机器上授予某人 su 权限并试图确保他们不能在其上安装恶意软件。

编辑:我检查了 Wordpress 文档,update_option() 函数在运行查询之前转义了字符串。您应该远离 SQL 注入。

【讨论】:

  • 是的...但是有没有什么方法可以让不是管理员的黑客甚至无需登录就可以访问选项页面?使用 PHP Shells 什么的?如果我尝试通过浏览器直接进入选项页面,我会得到一个 404...这是一件好事,对吧?
  • 当然,可能。可能有一些 WordPress 漏洞允许未经授权的用户获得管理员访问权限。
猜你喜欢
  • 2021-11-12
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 2016-10-08
  • 2020-02-17
相关资源
最近更新 更多