Php 在没有准备好的语句的情况下使用查询或大量的字符串操作是否不安全和错误? Pb>认为BBBY下降表,现在考虑以下内容: $dbh = new PDO("mysql:host=...;dbname=mysql", ...); $dbh->query("use newdatabase");

Php 在没有准备好的语句的情况下使用查询或大量的字符串操作是否不安全和错误? Pb>认为BBBY下降表,现在考虑以下内容: $dbh = new PDO("mysql:host=...;dbname=mysql", ...); $dbh->query("use newdatabase");,php,mysql,pdo,Php,Mysql,Pdo,这似乎非常不安全。为什么我会想要这个?因为我已经构建了自己的数据库连接工具,最后一部分是允许您指定要使用的数据库。我的连接工具在一天结束时返回一个\PDO对象,无论您连接到哪种类型的数据库服务器:pgsql、mysql或sqlite 问题是,如果我创建一个setDatabase(string$database),那么您可能是恶意的是通过连接字符串然后连接的合适方法吗?还是有一种安全的方法可以连接然后设置数据库?我相信这是安全的。只要没有用户输入输入到setDatabase()。如果用户输入确实需

这似乎非常不安全。为什么我会想要这个?因为我已经构建了自己的数据库连接工具,最后一部分是允许您指定要使用的数据库。我的连接工具在一天结束时返回一个
\PDO
对象,无论您连接到哪种类型的数据库服务器:pgsql、mysql或sqlite


问题是,如果我创建一个
setDatabase(string$database)
,那么您可能是恶意的是通过连接字符串然后连接的合适方法吗?还是有一种安全的方法可以连接然后设置数据库?

我相信这是安全的。只要没有用户输入输入到
setDatabase()
。如果用户输入确实需要传递到
setDatabase()
,则可以使用某种形式的可用数据库白名单


简而言之:这是安全的,因为没有用户输入,也没有注入的机会。

无论查询是什么以及是否使用准备好的语句,都可以通过以下两个步骤保护脚本免受SQL注入的影响:

1。始终转义用户输入

<?php
    $user_input = htmlspecialchars($user_input, ENT_QUOTES | ENT_HTML5, "UTF-8", false);

如果您使用WHERE和comparing整数,您没有义务用引号将值括起来,但在这种情况下,有人可以轻松地执行SQL注入,而
htmlspecialchars
则无法保护您。

接受将有:$databaseName。我设计his的方式(可能是错误的)是,您可以在不设置连接字符串的数据库的情况下进行连接,然后连接,然后设置所述数据库名称。因此,我问这是否是错误的,正确的方法是什么。不,这很好。你还提到了白名单数据库名称,技术上你不能,因为用户可以执行sql创建脚本,并随时调用他们的数据库,所以可能创建数据库博客,然后它将是setDatabase('blog')这就是为什么我想知道这是否是一个安全问题。但是,如果让用户动态设置数据库,则至少需要一种黑名单来限制对为服务器本身保留的数据库的访问,如果存在某些管理员设置或其他重要内容,您不希望用户直接干扰@MasivuyeCokile No的可能副本。
SELECT * FROM `table` WHERE `value` = "some value here";