我需要通过我的MySQL查询的网址传递特殊的符号。例如,我需要一个类似于以下内容的URL:
www.example.com/index.php?q=AND name LIKE '%hi%'当我一开始尝试它的时候,我得到了一个406错误。我查了一下,显然我必须使用urlencode()和urldecode()。我把它们放进去,然后406错误消失了,但是我得到了一个MySQL错误:
mysql_fetch_array(): supplied argument is not a valid MySQL result resource通常,当我得到这些时,这意味着查询写得不正确。因此,我响应了MySQL查询,一切看起来都很好。我甚至删除了urldecode(),并将其硬编码到一个变量中,这就是我想要传递给页面的内容,MySQL错误就消失了。但是,使用urldecode()和不使用这两个查询都是完全相同的,所以我有点困惑。
我进入了urldecode()的urldecode()文档页面,有一个警告说,像使用_GET和urldecode()这样的东西可能会导致意想不到的事情,而_GET已经起到了译码器的作用(至少我是这么解释的),所以我删除了urldecode(),但仍然留在_GET中,这导致文本没有被解码,所以我想我没有正确地解释文档。
urldecode()与MySQL查询不兼容吗?我相当肯定这是编码/解码的问题,因为我已经用绕过编码/解码的硬编码信息测试了我的代码,并且运行良好。也许urldecode()正在以某种方式将这些字符转换成特殊的字符,它们看起来相同,但内部不同,所以MySQL无法读取它们?
发布于 2012-07-18 18:10:16
不要这样做。这是错误的。当然,任何人都可以使用;结束查询,并启动一个新的查询,删除所有内容或读出用户和密码。
一个简单而更好的方法是使用www.example.com/index.php?q=hi作为您的URL,然后在服务器上(让我们假设PHP)
$queryString = mysql_real_escape_string($_GET['q']);
$query = "AND name LIKE '%$queryString%'";
// Then replace $query for whatever you were using $_GET['q'] for before.
// Feel free to rename my variables what you like!这样,用户就不会把事情搞砸,URL看起来也更干净了。mysql_real_escape_string函数通过转义事物使字符串在查询中安全使用。有关这方面的更多信息,请阅读http://php.net/manual/en/function.mysql-real-escape-string.php。
如果你仍然不相信这是有用的,想想如果有人发布一个链接,它会丢弃你的表,然后谷歌每周爬一次。你的数据将被删除,任何时候,谷歌碰巧路过。
一旦您对这一技术感到满意,请阅读rewrite (如果使用Apache)来更多地清理URL、mysqli和它是mysql函数的一个改进版本,最后是PHP Data Objects (PDO),它有助于更多地清理PHP。
发布于 2012-07-19 17:26:51
Rich有正确的一般想法,但比引用更好的是使用数据库参数。它实际上在SQL查询中放置了一个“变量令牌”,然后分别传递变量。查询的结果如下所示:
SELECT ID, VALUE1, VALUE2
FROM MY_TABLE
WHERE VALUE3 = :param然后在代码中添加一个值以替代:param,然后将其与SQL一起发送到数据库中。(在某些DB库中,您会使用?而不是参数名称。)它比引用更好的理由有三个:
首先,可以保持查询字符串不变,而不必每次都重新构建查询字符串,这样可以提高服务器的性能。
其次,如果使用多个不同的参数多次向数据库发送相同的常量查询,则数据库引擎可以缓存查询计划,从而提高DB上的性能。
第三,当您习惯于以参数化的方式编写查询时,这是很自然的,特别是如果您使用一个以参数列表作为参数的查询函数,所以很难出错。相比之下,很容易忘记引用某些内容,然后您意外地在程序中打开了一个安全漏洞。
参数化的具体工作方式取决于您正在使用的数据库和DB访问库,但每个SQL数据库都支持它们。你应该看看你正在使用的系统是如何做到的。这确实是使用SQL的最佳方法,特别是当输入来自不受信任的来源(如Internet )时。
发布于 2012-07-23 09:27:09
在调用mysql_query()之后,在调用mysql_fetch_array()之前,您应该检查查询是否返回false,如果返回了,则打印mysql_error()。例如:
$result = mysql_query($query);
if (!$result) {
die(htmlenitites(mysql_error())." when running <pre>".htmlenitites($query)."</pre>");
}但是:
https://stackoverflow.com/questions/11546349
复制相似问题