2010-01-13 25 views
0

我有一个C/CGI应用程序。为了重定向到同一页面在C/CGI中处理后URL被更改

const char * redirect_page_format = 
"<html>\n" 
"<head>\n" 
"<meta http-equiv=\"REFRESH\"\n" 
"content=\"0;url=%s\">\n" 
"</head>\n" 
"</html>\n"; 
printf (redirect_page_format, getenv (URL)); 

在此之前的URL是这样的“http://ipaddress/page.html”。

对于某些页面,我可以正确重定向。

但一些HTML页面,

  1. 的网址不具有像一个字符追加这个 “http://ipaddress/page.htmlP

  2. 或网址改变像下列之一:

http://ipaddress/page.htm

http://ipaddress/page.hX

编辑1

我将通过查询字符串发送URL。它将通过命令得到。

的getenv( “QUERY_STRING”)

通过解析查询字符串,URL可以得到,它是作为参数给出重定向命令。

printf(redirect_page_format,getenv(URL));

+0

你确定环境变量'URL'总是被定义的吗?它里面可以有'''''你有'#include '? – 2010-01-13 12:27:30

回答

0

我看不到任何会导致在上面的代码。听起来像是一些任性的指针写在脚本的其他地方可能写了数据来破坏变量字符串的结尾?

什么是getenv(URL)?没有标准的CGI环境变量给你当前的URL;您通常必须将其从REQUEST_METHOD/HTTP_HOST/SERVER_PORT/SCRIPT_NAME/PATH_INFO/QUERY_STRING拼凑在一起。在Apache上,您获得了REQUEST_URI,但在其他服务器上无法使用。

虽然它通常不会导致你引用的问题,有一个与printfing文本的问题到HTML中的上下文就像你有以上:你没有任何HTML转义,所以任何&"<字符在URL中会导致输出无效。每当您从字符串添加文本或属性值内容时,您都必须使用HTML进行转义,否则您可能冒着跨站点脚本安全漏洞。 ("<不可能在URL中存在,但能到达那里取决于你如何处理SCRIPT_NAME/PATH_INFO。&极有可能出现在URL)。

最后,<meta refresh>对重定向是极不可取的。为什么不适当的基于Location的重定向?