关于SQL语句,我们使用的旧SQL语句很容易在我正在为此工作的公司注入SQL(他们都是没有很多网络经验的计算机程序员)而我正试图让他们和我自己转向使用准备好的陈述。我已经阅读了很多关于它的内容,但它仍然有点不清楚。
例如,我们使用include(/mnt/configdb.php)然后使用db_connect();在我们的PHP文件中使用SQL(而不是SQLi)通过ini文件连接到每个SQL DB。我想使用更好的方法/语句mysqli_connect(),当我们需要更改服务器和更新SQL信息时(如果服务器移动),它将是灵活的。什么最好的想法? mysqli_connect()vs mysql_connect或使用函数调用来连接到服务器上的ini文件,就像我已经在做的那样?
例如,我想设置它以便我创建一个connect.php文件,并且它为我需要访问的每个模式有多个数据库连接,然后我只需要在必要的PHP中包含该文件和sqli语句将所有变量发送到需要连接的SQL DB的文件。什么是最好的方法,或者我如何转换我已经(下面)并将其转换为sqli和准备好的语句?我应该使用SQLi吗?或者只是坚持使用SQL?
服务器上的configdb:
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();
答案 0 :(得分:2)
首先,我建议去PDO,而不是mysqli。
其次,不要只是将vlnerable代码挂在那里..在mysql_escape_string中包装不安全的变量真的很容易
第三,我强烈建议使用模型映射器抽象而不是直接的sql语句。这将节省您首先编写95%的查询。此外,您可以编写代码生成器,以便从数据库中为您生成模型/映射器代码。这可能听起来很难,但实际上它非常容易。
答案 1 :(得分: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']));
就是这样。