当前位置:首页 > CN2资讯 > 正文内容

java 文件路径适配服务器 java windows路径

2天前CN2资讯


AUTHOR:kj021320
TEAM: I.S.T.O

JAVA WEB文件上传 是取用户提交的文件名字而不是从random取随机器数字 就值得注意了
跟以前ASP+ADO.STREAM的上传漏洞同理
因为 WINDOWS平台不支持 带有/00字符的文件目录或者文件名字
所以 JAVA虽然与平台无关 但是他底层操作的时候必定是调用平台的API 所以就会难免有些与平台关联的
安全隐患或者漏洞令 JAVA语言开发者不能一一顾及周全 OK 下面是一个简单的代码例子

String filepath="c://kj021320.jsp"+(char)0+".txt"; System.out.println(filepath); FileOutputStream fos=new FileOutputStream(filepath); fos.write("hello".getBytes()); fos.close(); byte [] b=new byte[100]; int i=0; FileInputStream fis=new FileInputStream(filepath); i=fis.read(b); out.println(new String(b,0,i)); fis.close();

然后看看有什么输出?

OK 以上都做了代码的测试 下面我们来分析JVM最终调用流程
来从源到内部核心实现
首先 分析FileOutputStream 类构造函数

//这个构造方法调用了 另一个构造函数 public FileOutputStream(String name) throws FileNotFoundException { this(name != null ? new File(name) : null, false); } //以下就是被调用另外构造函数的具体实现 public FileOutputStream(File file, boolean append)throws FileNotFoundException { String name = (file != null ? file.getPath() : null); SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkWrite(name);//做安全检查 JAVA沙箱里面是否有权限写 } if (name == null) { throw new NullPointerException(); } fd = new FileDescriptor(); this.append = append; if (append) { openAppend(name);//调用 openAppend } else { open(name); //调用open } }

分析完了上面 FileOutputStream类里面的2个构造方法 我们可以继续跟踪进去
看看 open openAppend的实现

private native void open(String name) throws FileNotFoundException;
private native void openAppend(String name) throws FileNotFoundException;
不过很让我们遗憾!两个方法都是本地代码实现~ 到这里就结束了吗?不~  JDK6以前的源代码SUN公司是没有公布的!但是我们可以去下载
OPENJDK http://openjdk.java.net/ 里面的全部源代码估计都 大同小异的!
打开 openjdk源代码 openjdk/j2se/src/windows/native/java/io/FileOutputStream_md.c 目录下面会有

FileOutputStream 这个类的JNI实现 Java_java_io_FileOutputStream_open(JNIEnv *env, jobject this, jstring path) { fileOpen(env, this, path, fos_fd, O_WRONLY | O_CREAT | O_TRUNC); }


调用了 fileOpen 继续跟踪进去,这个函数是在io_util_md.c 这个文件里面实现的

void fileOpen(JNIEnv *env, jobject this, jstring path, jfieldID fid, int flags){ jlong h = winFileHandleOpen(env, path, flags); if (h >= 0) { SET_FD(this, h, fid); } }


看来又调用了 winFileHandleOpen 这个函数 估计里面肯定也是调用WIN32API来创建文件 不用说了,继续

jlong winFileHandleOpen(JNIEnv *env, jstring path, int flags){ const DWORD access = (flags & O_RDWR) ? (GENERIC_WRITE | GENERIC_READ) : (flags & O_WRONLY) ? GENERIC_WRITE : GENERIC_READ; const DWORD sharing = FILE_SHARE_READ | FILE_SHARE_WRITE; const DWORD disposition = /* Note: O_TRUNC overrides O_CREAT */ (flags & O_TRUNC) ? CREATE_ALWAYS : (flags & O_CREAT) ? OPEN_ALWAYS : OPEN_EXISTING; const DWORD maybeWriteThrough = (flags & (O_SYNC | O_DSYNC)) ? FILE_FLAG_WRITE_THROUGH : FILE_ATTRIBUTE_NORMAL; const DWORD maybeDeleteOnClose = (flags & O_TEMPORARY) ? FILE_FLAG_DELETE_ON_CLOSE : FILE_ATTRIBUTE_NORMAL; const DWORD flagsAndAttributes = maybeWriteThrough | maybeDeleteOnClose; HANDLE h = NULL; if (onNT) { WCHAR *pathbuf = pathToNTPath(env, path, JNI_TRUE); if (pathbuf == NULL) { /* Exception already pending */ return -1; } h = CreateFileW( pathbuf, /* Wide char path name */ access, /* Read and/or write permission */ sharing, /* File sharing flags */ NULL, /* Security attributes */ disposition, /* creation disposition */ flagsAndAttributes, /* flags and attributes */ NULL); free(pathbuf); } else { WITH_PLATFORM_STRING(env, path, _ps) { h = CreateFile(_ps, access, sharing, NULL, disposition, flagsAndAttributes, NULL); } END_PLATFORM_STRING(env, _ps); } if (h == INVALID_HANDLE_VALUE) { int error = GetLastError(); if (error == ERROR_TOO_MANY_OPEN_FILES) { JNU_ThrowByName(env, JNU_JAVAIOPKG "IOException", "Too many open files"); return -1; } throwFileNotFoundException(env, path); return -1; } return (jlong) h; }


//简单看一下以上的代码 最终都是调用 CreateFileW 来创建一个文件
而他采用 pathToNTPath 这个函数来对路径进行转换里面也没有对/00字符过滤导致在windows平台下面这个漏洞

OK 那现在我们来看看.NET的表现! 首先分析他的文件操作类
打开一个 Reflector.exe 反编译器 FileStream的构造函数太多我就不贴出来了 他最终会调用Path类的方法进行验证

internal static void CheckInvalidPathChars(string path) { if (-1 != path.IndexOfAny(InternalInvalidPathChars)) { throw new ArgumentException(Environment.GetResourceString("Argument_InvalidPathChars")); } }


以上代码 如果包含了非法字符!会抛出一个异常~
看看 InternalInvalidPathChars 是怎么定义的

InternalInvalidPathChars = new char[] { '"', '<', '>', '|', '/0', '/b', '/x0010', '/x0011', '/x0012', '/x0014', '/x0015', '/x0016', '/x0017', '/x0018', '/x0019' };


呵呵 看来 .NET 在 MS平台上面做得更充分

呵呵! YY一下
WINDOWS:"555~~JAVA你不懂我的心!"
JAVA:"汗~~~......"
.NET:"我的地盘我做主...嘎嘎"
 

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/31440.html

    分享给朋友:

    “java 文件路径适配服务器 java windows路径” 的相关文章

    国外常用ping工具及其使用方法

    ping工具在国外的应用 什么是ping工具?其基本功能和重要性 ping工具是一种非常实用的网络诊断工具,通过向指定的IP地址发送数据包来检测网络连接的质量。当我们在互联网上进行访问时,ping工具能够帮助我们了解网络延迟、丢包率等关键指标。这些信息对于网站运营者和普通用户来说都是极其重要的,因为...

    如何在阿里云国际版上顺利注册与管理账户

    在数字化时代,云计算逐渐成为企业和个人不可或缺的工具。阿里云国际版(Alibaba Cloud International)便是阿里巴巴集团为全球用户推出的一项创新服务。这项服务的目标是让全球的用户,特别是非中国大陆地区的用户,能更方便地接触到高效、安全的云计算资源。 阿里云国际版的推出背景极为重要...

    Host Winds:可再生能源的关键因素与未来发展潜力

    什么是 Host Winds? 在谈论可再生能源时,Host Winds 是一个不容忽视的概念。简单来说,Host Winds 指的就是那些发生在某一特定区域内的风速和风向。这些风的模式能够极大地影响一个地区的风力发电潜力。想象一下,如果你在一个风速稳定且方向一致的地区,那么利用这些风来发电就会更加...

    GPU租用市场的崛起与行业应用分析

    在过去的几年中,GPU租用市场的发展速度让我惊叹,真的如雨后春笋般冒出。随着科技的不断进步和市场需求的增长,越来越多的人选择租用GPU来满足高性能计算的需求。这种选择不仅适用于企业,也吸引了许多个人用户。GPU租用为我们提供了便利,加速了各类计算密集型任务的完成。 GPU租用的定义非常简单,就是将高...

    域名购买推荐:如何选择最适合你的域名注册商

    域名购买推荐概述 在互联网时代,域名显得尤为重要。对于个人用户、企业甚至是初创团队来说,域名不仅是网站的门面,更是品牌形象和业务宣传的基石。记得我第一次建立网站时,选择一个合适的域名让我意识到它的价值。一个容易记住、与品牌相关的域名可以有效吸引流量,提升访问者的信任感。 在选购域名时,有几点基本原则...

    全面解析UDP攻击:类型、影响及有效防御策略

    在当今网络环境中,UDP攻击是一个话题无法忽视的安全隐患。它是一种常见的网络攻击形式,通常会给目标服务器带来严重的资源消耗。为了更好地理解这一现象,我们不妨简单回顾一下UDP协议的特性,以及攻击者是如何利用这一协议实施攻击的。 UDP,即用户数据报协议(User Datagram Protocol)...