-2

我在 PHP 中制作了一个简单的搜索脚本,用于搜索 mySQL 数据库并输出结果。这是如何工作的:

  • 用户通过搜索表单搜索“jack's”。
  • 我的 PHP 脚本GET是这个搜索,并对其进行清理。
  • 然后脚本使用SELECTandLIKE得到结果。
  • 然后脚本将结果输出给用户。
  • 最后,脚本告诉用户“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可能以某种方式导致注射——这是正确的吗?

4

1 回答 1

0

出于某种原因,我们也需要转义反斜杠
所以,我相信正确的代码是

if(isset($_GET['q'])){
  $_GET['q'] = trim($_GET['q']);
  if(strlen($_GET['q']) >= 2){
    $q = $_GET['q'];
    $q = '%'.addCslashes($q, '\%_').'%';
    // now we have the value ready either for escaping or binding
    $q = mysql_real_escape_string($q);
    $sql = "SELECT name, age, address FROM book WHERE name LIKE '$q'";
    //or 
    $sql = "SELECT name, age, address FROM book WHERE name LIKE ?";
    $stm = $pdo->prepare($sql);
    $stm->execute(array($q));
    $data = $stm->fetchAll();
  }
}

对于输出,使用

echo htmlspecialchars($_GET['q']);

这里不需要stripslashes。

此外,我听说 magic_quotes 和 charset 可能会以某种方式导致注入 - 这是正确的吗?

如果您不使用魔术引号,它们不会损害您的安全。
charset 在一些极其罕见的编码的情况下是危险的,但只有在设置不正确的情况下。ifmysql(i)_set_charset或 DSN(在 PDO 的情况下)被用于此目的 - 你又安全了。

至于 PDO,我相信一个标签 wiki对于初学者来说应该足够了

于 2013-04-21T19:03:33.613 回答