我用 PHP 编写了一个简单的搜索脚本,用于搜索 mySQL 数据库并输出结果。它的工作原理是这样的:
- 用户通过搜索表单搜索“jack's”。
- 我的 PHP 脚本
GET
就是这个搜索,并对其进行清理。
- 然后是脚本,使用
SELECT
and 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
and charset
可能以某种方式导致注射——这是正确的吗?
由于某种原因我们还需要转义反斜杠 http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html too.
所以,我相信正确的代码是
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']);
这里不需要 stripslash。
此外,我听说 magic_quotes 和 charset 可能以某种方式导致注入 - 这是正确的吗?
如果您不使用魔术引号,它们不会损害您的安全。
字符集在某些极其罕见的编码情况下是危险的,但前提是设置不正确。如果mysql(i)_set_charset
或 DSN(如果是 PDO)已用于此目的 - 您又安全了。
对于 PDO,tag wiki https://stackoverflow.com/tags/pdo/info我相信对于初学者来说应该足够了
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)