通过php中的post方法将奇怪的文本作为变量传递

时间:2009-06-09 19:45:07

标签: php javascript html unicode

我有一个奇怪的问题。我们公司收集数据,我们使用一个可怕的软件来处理我们的所有电话采访。它使用二进制文件而不是SQL,不使用压缩。截至目前,我们必须手动为客户端运行所有报告。我正在为我们的数据和常见报告构建一个Web界面。

现在我需要从网络向服务器发送一个名为“select语句”的内容,我用php post方法执行此操作。问题是Web浏览器似乎不喜欢某些必须在select语句中使用的字符。我已经尝试过对它们进行编码,但是当它们是超链接时,浏览器会自动将它们解码回纯文本。

以下是一些示例select语句。

[3023.2#1] 
[3023.2$] = "1"
[3023.2<>1]
[500.10$] = "Name"

网址看起来像

CustomReport.php?type=1&select="[3023.2#1]"

我遇到的问题是,不同的select语句会根据使用的引号打破网站。 select = [3023.2&lt;&gt; 1]不会工作,但选择=“[3023.2&lt;&gt; 1]”确实如此。但是,如果我选择= [3023.2#1]它将工作并使用引号将打破它。当它破坏时,WebDev工具栏和FireBug都没有报告任何错误,但它显而易见的我的DIV都搞砸了。

我还应该补充说,网站上没有显示select语句,它只在php中用作exec命令的一部分,所以我真的很困惑为什么这会破坏我的网站。

/绳索结束
//可能是一些愚蠢的事情

6 个答案:

答案 0 :(得分:3)

您想要研究rawurlencodehtmlentities。他们应该帮助你。

除此之外:必须注意来自匿名的注释要小心地在url上传递可执行命令。听起来您的应用程序不在公共网络上,但如果是,您需要注意与此相关的安全问题。

<?php 

$select_statements = array(
    '[3023.2#1]',
    '[3023.2$] = "1"',
    '[3023.2<>1]',
    '[500.10$] = "Name"',
);

foreach ($select_statements as $ss) {
    print htmlentities($ss);
    print "<br>";
    $url = $_SERVER['PHP_SELF'] . "?type=1&amp;select=" . rawurlencode($ss);
    print "<a href=\"{$url}\">{$url}</a>";  
    print "<br>";
    print "<br>";
}

print htmlentities($_GET['select']);

?>

结果(对我而言):

  

[3023.2#1]   /CustomReport.php?type=1&select=%5B3023.2%231%5D

     

[3023.2 $] =“1”   /CustomReport.php?type=1&select=%5B3023.2%24%5D%20%3D%20%221%22

     

[3023.2&LT;大于1]   /CustomReport.php?type=1&select=%5B3023.2%3C%3E1%5D

     

[500.10 $] =“姓名”   /CustomReport.php?type=1&select=%5B500.10%24%5D%20%3D%20%22Name%22

如果我点击链接,我也会看到我输入的任何选项。当然,正确地放入html实体。

答案 1 :(得分:1)

您是否尝试过仅对选择部分进行网址编码?

$queryString = 'select=' . urlencode($select);

答案 2 :(得分:0)

对于每个参数,您应该使用urlencode来转义字符:

$select = urlencode("[3023.2#1]");

通过http://us2.php.net/urlencode

答案 3 :(得分:0)

尝试在选择字符串上使用urlencode / urldecode函数。这应该正确编码所有奇怪的字符。

也要小心exec命令。它方便但危险。

答案 4 :(得分:0)

你也可以放弃使用POST。而是将语句存储在会话变量,数据库或临时文件中,然后检索以便在下一页上进行处理。

如果使用数据库,请使用带有utf8编码的二进制类型文本字段,这样可以处理奇怪的字符。

答案 5 :(得分:0)

为什么使用GUI上的值直接构建查询语句?您应该将所有这些“查询”隐藏在映射中的服务器上,以获得理智的值,并且除了来自Web客户端的合理值之外:

 $queries = Array(
       'meaningfulname1' => '[3023.2#1]',
       'meaningfulname2' => '[3023.2$] = "1"',
       'meaningfulname3' => '[3023.2<>1]',
       'meaningfulname4' => '[500.10$] = "Name"',
 );

然后您的网址就是

 CustomReport.php?type=1&select=meaningfulname1

现在,您可以轻松地将“有意义的名称1”转换为您的软件所需的正确代码序列,而不会将后端的疯狂暴露给浏览器。这也意味着如果您以某种方式修复后端以使用其他查询语言(如SQL),则无需重新编码GUI层。它仍然要求有意义的名字。