【发布时间】:2013-06-23 17:34:42
【问题描述】:
我正在编写一个网络应用程序,该应用程序将在内部用于各种任务。 它使用一个 MySQL 数据库,该数据库需要定期查询数据。
我知道准备好的语句,它们是最佳实践,但考虑到大量的表和连接,我发现编写一个接受查询、运行并返回结果的通用函数是最简单的。
我知道如果它在实时站点上,它可能容易受到 SQL 注入的攻击,但是使用这种方法有什么固有的坏处吗?我对 php 和 MySQL 之间的接口比较陌生,并且有兴趣了解在 webapp 中运行语句的可重复方法的最佳实践。
这是我将用于SELECT 查询的示例函数。
function getSQLResultsPDO($query){
$mydb = new PDO('mysql:host=localhost;dbname=mydatabase;charset=utf8', 'user', 'password');
$sth = $mydb->prepare($query);
if (!$sth) {
echo "\n<pre>PDO::errorInfo():</pre>\n";
echo "<pre>";
print_r($conn->errorInfo());
echo "</pre>";
}
$sth->execute();
$result = $sth->fetchAll(PDO::FETCH_CLASS);
if (empty($result)){
$result = false;
}
return $result;
}
【问题讨论】:
-
这不是关于 SQL 注入,而是关于语法正确性! The Great Escapism (Or: What You Need To Know To Work With Text Within Text)
-
你真的为每一个查询创建一个新的连接吗?
-
@jay 仅当抛出的异常按原样转储到屏幕时。情况不一定如此。如果您在方法内捕获异常,那么首先抛出它没有真正意义。他甚至没有使用异常错误模式。
-
@Bartdude:完全可以注入自己,没有任何“用户”数据接近查询。 任何进入查询的外部数据都可以是注入源,无论它来自远程用户表单提交,甚至是您之前从数据库中选择的数据。
-
@Bartdude 请阅读有关该主题的内容。准备好的陈述是必须的。没有理由。没有例外。没有冗长的考虑“这些数据是否安全”。另请阅读此处的第一条评论。