-1

关于 SQL 语句,我们正在使用旧的 SQL 语句,在我工作的这家公司中,这些语句很容易被 SQL 注入(他们都是没有太多网络经验的计算机程序员),我正在努力让他们和我自己朝着使用准备好的语句。我已经阅读了很多关于它的内容,但仍然有点不清楚。

例如,我们使用的是 include(/mnt/configdb.php),然后是 db_connect();在我们的 PHP 文件中,通过使用 SQL(不是 SQLi)的 ini 文件连接到每个 SQL DB。我想使用更好的方法/语句,也许是 mysqli_connect(),当我们需要更改服务器和更新 SQL 信息(在服务器移动的情况下)时,它们会很灵活。知道什么最有效吗?mysqli_connect() 与 mysql_connect 或使用函数调用连接到服务器上的 ini 文件,就像我已经在做的那样?

例如,我想对其进行设置,以便创建一个 connect.php 文件,并且它为我需要访问的每个模式都有多个数据库连接,然后我只需将该文件和 sqli 语句包含在必要的 PHP 文件中,即将所有变量发送到它需要连接的 SQL DB。解决此问题的最佳方法是什么,或者如何转换我已经拥有的(如下)并将其转换为 sqli 和准备好的语句?我什至应该使用 SQLi 吗?或者只是坚持使用 SQL?

服务器上的配置数据库:

function db_config_cables()
{
//Parse and store the db ini file, this will return an associative array
global $dbhost,  $dbuser,  $dbpass,  $dbname;
//Point to global ini file
$config_info = parse_ini_file('config.ini', true);
//Call specific db
$dbhost = $config_info['tablename_here']['db_host'];
$dbuser = $config_info['tablename_here']['db_user'];
$dbpass = $config_info['tablename_here']['db_pass'];
$dbname = $config_info['tablename_here']['db_name'];
}

服务器上的 accessdb 文件:

function db_connect()
{
global $dblink, $dbhost,  $dbuser,  $dbpass,  $dbname;
$dblink = @mysql_connect($dbhost,  $dbuser,  $dbpass) or die ('DB ERROR - Could not connect: '.mysql_error());
@mysql_select_db($dbname) or die ('DB Error - Could not select: '.mysql_error());
}
function close_db()
{
global $dblink;
@mysql_close($dblink) or die ('DB ERROR - Could not close: '.mysql_error());
}

用于将数据发布到 SQL 数据库的 PHP 文件:

require("/mnt/library/configdb.php");        
require("/mnt/library/accessdb.php");

//Connect to SQL DB
db_config_cables();
db_connect();

$unsafe_variable = $_POST['unsafe_variable'];

mysql_query("INSERT INTO tablename (column_name,...) VALUES('$unsafe_variable',...)")
/* close connection */
close_db();
4

2 回答 2

2

首先,我建议去 PDO,而不是 mysqli。

其次,不要只是把 vlnerable 代码挂在那里.. 在 mysql_escape_string 中包装不安全的变量真的很容易

第三,我强烈推荐使用模型映射器抽象而不是直接的 sql 语句。这将节省您首先编写 95% 的查询。此外,您可以编写代码生成器,从数据库中为您生成模型/映射器代码。听起来可能很难,但实际上超级超级容易。

于 2013-05-03T18:24:23.783 回答
0

首先,我不明白为什么您的担忧如此微不足道,而您的查询仍然处于危险之中。

接下来,我强​​烈建议使用PDO而不是 mysqli。

现在回答你的问题。
我在这里根本没有看到太大的问题。

您当前的设置已经很灵活了。/mnt/configdb.php只需在移动到新服务器时更改数据库凭据- 仅此而已。

那么,我做了什么:

包含凭据和实际连接代码的同一/mnt/configdb.php文件(因为我认为拥有不同的连接功能没有意义。如果您包含凭据 - 您也将连接)。然后include_once()在我需要数据库连接的任何地方:

require("/mnt/library/configdb.php");        
$stm = $pdo->prepare("INSERT INTO tablename (column_name,...) VALUES(?,...)");
$srm->execute(array($_POST['unsafe_variable']));

就这样。

于 2013-05-03T18:20:43.610 回答