【发布时间】:2014-07-20 08:43:11
【问题描述】:
我正在使用 PDO 准备好的语句,在处理我当前的项目时,我决定为我需要的每个操作创建几个函数。下面是 fetch 的例子
function db_fetchAll($sql, $param) {
global $db;
$stmt = $db->prepare($sql);
if (empty($param)) {
$stmt->execute();
} else {
$stmt->execute($param);
}
$count = $stmt->rowCount();
if ($count == 0) {
$result = "";
} elseif ($count == 1) {
$result[] = $stmt->fetch();
} elseif ($count > 1) {
$result = $stmt->fetchAll();
}
return $result;
}
例子
$database = db_fetchAll("SELECT * FROM database_table WHERE id=:id", array(':id' => $id));
它只将查询的行数从 3 行压缩到 1 行,但是对于每个页面所需的信息量,它值得压缩。
我将返回该项目进行最后一次通过,我只是想就其安全性提出第二意见。如果有什么我应该添加的,等等。所有 user_input 都通过这个函数传递
function user_input($input) {
$input = trim($input);
$output = strip_tags($input);
return $output;
}
所有输出都使用 htmlspecialchars。
所以简而言之,问题是: 这安全吗? 我还能做些什么来防止任何其他形式的注射等?
我完全理解准备好的陈述是如何工作的,我只是说得透彻,这个网站的第 1 版是一场噩梦,大量的注入,获得对管理员帐户的访问权限等等。
【问题讨论】:
-
你在问什么?你问安全吗?您正在使用准备好的语句,并且您正在正确使用它们……没关系。
-
是的,这就是问题所在,我进行了编辑以使事情更清晰。
-
您可能需要检查
$stmt->execute();的返回值是否有错误。 -
您说得对,常识先生,例如他可能希望 PDO 抛出异常。
-
在生产模式期间(在全局文件中定义)不会抛出错误(error_reporting(0))它们只是被记录下来。同样对于依赖于特定查询的页面(例如用户配置文件),如果函数返回空,则页面将重定向到 404。在仅显示信息的其他页面上,如果函数返回空,则信息将保持隐藏状态。