我有一个奇怪的问题。我们公司收集数据,我们使用一个可怕的软件来处理我们的所有电话采访。它使用二进制文件而不是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命令的一部分,所以我真的很困惑为什么这会破坏我的网站。
/绳索结束
//可能是一些愚蠢的事情
答案 0 :(得分:3)
您想要研究rawurlencode和htmlentities。他们应该帮助你。
除此之外:必须注意来自匿名的注释要小心地在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&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)
答案 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层。它仍然要求有意义的名字。