【发布时间】:2013-04-14 14:18:54
【问题描述】:
我用 PHP 编写了一个简单的搜索脚本,它搜索 mySQL 数据库并输出结果。它的工作原理是这样的:
- 用户通过搜索表单搜索“jack's”。
- 我的 PHP 脚本
GETs 这个搜索,并清理它。 - 然后脚本,使用
SELECT和LIKE,得到结果。 - 脚本然后将结果输出给用户。
- 最后,脚本告诉用户“jack 已返回 x 个结果”。在逃跑的帮助下。
我想问的是,我做得对吗?
这是我在 SELECTING 之前从数据库中清理的方式:
if(isset($_GET['q'])){
if(strlen(trim($_GET['q'])) >= 2){
$q = trim(mysql_real_escape_string(addcslashes($_GET['q'], '%_')));
$sql = "SELECT name, age, address FROM book WHERE name LIKE '%".$q."%'";
}
}
这就是我在输出“jack's returned x results”之前的转义方式。:
echo htmlspecialchars(stripslashes($q)) . " returned x results.";
这是正确的方法吗?
顺便说一句,我知道 PDO 和 mySQLi 是首选,因为它们通过使用准备好的语句进行自我消毒,但我对它们没有任何实际经验。但我很乐意看看,如果你们可以链接我一些新手教程/解释。
此外,我听说magic_quotes 和charset 可能会以某种方式导致注射——这是正确的吗?
【问题讨论】:
-
您的转义以完全错误的顺序应用。也许解释一下你认为它会如何工作。
-
@mario 是吗?我不知道哪个顺序更好/更正确。还是让我解释一下。当脚本
GETs 时,输入被修剪并检查输入是否等于或超过 2 个字符。然后,它首先通过在%和_中添加斜杠以防止通配符搜索,然后通过使用mysql_real_escape_string对输入进行清理,最后如果在开头或结尾有空格,它会修剪的输入。现在正在数据库中搜索它清理过的任何内容。至于转义——它有效,但我是从一个随机主题中得到的。 -
嗯,首先进行修剪,然后是 m_r_e_s,然后为 LIKE glob 添加cslashes。
-
好的。但是你能像我五岁一样解释一下,不同消毒功能的顺序有多重要吗?我的意思是..你能举例说明
trim, m_r_e_s, addcslashes的工作方式与addcslashes, m_r_e_s, trim有何不同/更好? -
你能评论一下输出吗?我能正确地逃避它吗?我还需要
htmlspecialchars函数吗?或者可以用更好的东西代替吗?
标签: php mysql input output mysql-real-escape-string