web服务器对url中的相对路径的处理("./", "//","../")
2013-05-13 21:39
615 查看
本次为了方便展示和调试,并没有将代买写入到真实的运行环境,而是单独写了一个test程序,
使用的思路主要是回溯。首先记录本次的开始位置,
情况一:如果本次得到内容时“./”,回溯到本次开始匹配的位置即可。
情况二:如果本次得到的内容是"/",回溯到本次开始匹配的位置即可。
情况三: 如果本次的到的内容时“../",首先回溯到本次开始匹配的位置,并且删除上一级目录
其他情况: 直接写入本次匹配的值。开始下一次匹配。
一下为程序代码,本code只经过本人的简单测试,可能会存在漏洞。希望大家在查看的同时,写出更好的代码。
blog:http://blog.csdn.net/rentiansheng/article/details/8922368
使用的思路主要是回溯。首先记录本次的开始位置,
情况一:如果本次得到内容时“./”,回溯到本次开始匹配的位置即可。
情况二:如果本次得到的内容是"/",回溯到本次开始匹配的位置即可。
情况三: 如果本次的到的内容时“../",首先回溯到本次开始匹配的位置,并且删除上一级目录
其他情况: 直接写入本次匹配的值。开始下一次匹配。
一下为程序代码,本code只经过本人的简单测试,可能会存在漏洞。希望大家在查看的同时,写出更好的代码。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <assert.h> /*对url中的相对路径的符合进行处理。 * 从url中移除 "/../", "//", "/./" 。 * * /reage/.. 真实路径为 / * /reage/../reage1 真实路径为 /reage1 * /reage/./reage1 真实路径为 /reage/reage1 * /reage//reage1 真实路径为 /reage/reage * * */ int buffer_path_simplify(char *dest, const char *src) { int count; char c; /* start保存结果路径的开始位置。 slash本次配皮的开始位置, walk正在匹配的字符 out将要写入的结果的位置 */ char *start, *slash, *walk, *out; char pre; //当前匹配的前一个字符 if (src == NULL || dest == NULL) return -1; walk = src; start = dest; out = dest; slash = dest; while (*walk == ' ') { walk++; } pre = *(walk++); c = *(walk++); if (pre != '/') { *(out++) = '/'; } *(out++) = pre; if (pre == '\0') { *out = 0; return 0; } while (1) { // '/'表示本次匹配的结束,'\0'表示整个过程的结束 if (c == '/' || c == '\0') { //计算本次共匹配到的字符 即使'/'与'/'的距离 count = out - slash; //说明本次匹配为../需要删除前面的目录 if (count == 3 && pre == '.') { //首先回到本次匹配的开始,即使../的一个点的位置, out = slash; //回溯到前面的一个目录,只要前面不是根目录 if (out > start) { out--; while (out > start && *out != '/') { out--; } } if (c == '\0') out++; } else if (count == 1 || pre == '.') { //本次匹配为“./”只要删除掉就可。即使回到本次开始匹配的位置 out = slash; if (c == '\0') out++; } slash = out; } if (c == '\0') break; //先将内容写入,本保存上一个的内容 pre = c; c = *walk; *out = pre; out++; walk++; } *out = '\0'; return 0; } int main(){ char dest[1024]; char path[1024] = "../reage/../reage//aa.c"; buffer_path_simplify(dest, path); printf("URL=\"%s\" == path=\"%s\"\n", path, dest); strcpy(path, "/../reage/../../../././reage//aa.c"); buffer_path_simplify(dest, path); printf("URL=\"%s\" == path=\"%s\"\n", path, dest); strcpy(path, "/reage/../"); buffer_path_simplify(dest, path); printf("URL=\"%s\" == path=\"%s\"\n", path, dest); strcpy(path, "/reage/../reage1"); buffer_path_simplify(dest, path); printf("URL=\"%s\" == path=\"%s\"\n", path, dest); strcpy(path, "/reage/./"); buffer_path_simplify(dest, path); printf("URL=\"%s\" == path=\"%s\"\n", path, dest); strcpy(path, "/reage//reage"); buffer_path_simplify(dest, path); printf("URL=\"%s\" == path=\"%s\"\n", path, dest); }
blog:http://blog.csdn.net/rentiansheng/article/details/8922368
相关文章推荐
- web服务器对url中的相对路径的处理("./", "//","../")
- 错误:无法打开web项目”****“,文件路径“****”与url“**”不符。这两者要映射到相同的服务器位置。
- 使用servlet 3.0 新特性 @WebServlet(urlPatterns = "/brainT") 访问 url,服务器报404错误
- asp.net(C#)服务器绝对路径转换成URL相对路径[修改]
- PHP获取当前url路径的函数及服务器变量:$_SERVER["QUERY_STRING"],$_SERVER["REQUEST_URI"],$_SERVER["SCRIPT_NAME"],$_SER
- javaweb中 ServletActionContext.getServletContext().getRealPath("")获得服务器路径
- webpack 打包成相对路径 css url路径问题
- 您试图打开的项目是WEB项目,需要通过指定其"Url"路径来打开它
- asp.net(C#)服务器绝对路径转换成URL相对路径[修改]
- asp.net(C#)服务器绝对路径转换成URL相对路径[修改] (转)
- js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq
- asp.net服务器绝对路径转换成URL相对路径
- PHP获取当前url路径的函数及服务器变量:$_SERVER["QUERY_STRING"],$_SERVER["REQUEST_URI"],$_SERVER["SCRIPT_NAME"],$_SERVER["PHP_SELF"]
- PHP获取当前url路径的函数及服务器变量:$_SERVER["QUERY_STRING"],$_SERVER["REQUEST_URI"],$_SERVER["SCRIPT_NAME"],$_SER
- asp.net(C#)服务器绝对路径与URL相对路径互转
- asp.net服务器绝对路径转换成URL相对路径
- asp.net服务器绝对路径转换成URL相对路径
- web服务器指定路径下的get参数接收与处理
- 新建asp.net web应用程序出现这样的错误,"尝试创建Web项目或打开位于URL"http://localhost/WebApplication1"的Web项目时,Web服务器服告了以下错误."http/1.1 500 Server Error""
- PHP获取当前url路径的函数及服务器变量:$_SERVER["QUERY_STRING"],$_SERVER["REQUEST_URI"],$_SERVER["SCRIPT_NAME"],$_SER