在下面给出的代码中,我试图修改它,以便从配置文件中使用数据库连接变量。这应该会使密码更加安全,因为我可以限制配置文件的权限。
请告诉我是否有一种方法可以修改代码,从另一个文件/config文件中获取数据库变量?
class ActivitycodesCollection {
var $list, $err, $sql;
// --- Private variables for database access
var $_db_host = "######";
var $_db_username = "######";
var $_db_passwd = "######";
var $_db_name = "######";
function query ($where="") {
mysql_pconnect ($this->_db_host, $this->_db_username, $this->_db_passwd);
mysql_select_db ($this->_db_name);
$where = "WHERE " . $where;
$sql = "SELECT * FROM activitycodes $where";
$result = mysql_query ($sql);
$this->err = mysql_error();
$this->sql = $sql;
if (mysql_num_rows($result) > 0) {
while (list($id) = mysql_fetch_array ($result)) {
$this->list[$id] = new activitycodes($id);
}
}
}
}
我尝试在这个类/函数中包含config.ini文件,但它抛出了一个类似的错误
unexpected T_VARIABLE, expecting T_FUNCTION
您的代码已经过时了
1) 属性不要使用var
,请使用private
或protected
2) 不要使用mysql_*函数,使用PDO
3) 不要在类中保留连接详细信息。只需要构造函数中的PDO连接
4) 不要信任范围之外的任何数据——不要只允许在SQL查询中写入一些不受信任的文本(通过$where
变量)
5) 读书。"PHP对象、模式和实践"现在将对您有所帮助,稍后将对"清理代码"有所帮助。
示例:
class ActivitycodesCollection
{
private $list;
private $PDO;
private $table_name;
public function __construct('PDO $PDO, $table_name)
{
$this->PDO = $PDO;
$this->table_name = $table_name;
}
public function fetchByParameter($parameter)
{
$query = $this->PDO->prepare("SELECT `id` FROM `{$this->table_name}` WHERE "
." some_field = :parameter");
if (!$query)
{
return false;
}
if (!($query->execute(array(':parameter'=> $parameter))))
{
return false;
}
$results = $query->fetchAll('PDO::FETCH_ASSOC);
if (!empty($result))
{
foreach ($results as $result)
{
$id = $result['id'];
$this->list[$id] = new ActivityCodes($id);
}
}
}
}
如果没有看到"config"文件,就无法说明如何为其编写解析器。一个简单的解决方案是编写一些设置变量的php代码,但如果您包含/需要它,则变量将在全局范围内设置,而不在方法内。但是您可以eval(file_get_contents($config_file_path)),这将在本地范围内设置变量,并冒着提供代码注入方法的风险。
顺便说一句,你提供的代码有很多问题。抛开SQL注入的潜在风险不谈,如果方法参数为null/blank,则查询的格式将不正确(请考虑函数查询($where="1")。依赖特定的列排序是不好的做法。
同样很难想象,当唯一可行的方法是通过suphp或baseopendir时,如何限制对该配置文件的访问。
将SQL连接数据放在单独的文件中根本不会增加安全性。实际上,将它们存储在没有.php
扩展名的文件中会降低安全性,因为用户可能可以访问它,而PHP文件的代码对任何用户都不可见。您也不能在配置文件上使用比在PHP文件上更严格的权限,因为运行PHP的任何用户(通常是Web服务器用户)都需要访问这些权限。
只需将连接数据存储在PHP文件中即可:
<?php
define('DB_HOST', '...');
define('DB_NAME', '...');
define('DB_USER', '...');
define('DB_PASS', '...');
然后包括这个文件(在类定义之外),并在建立连接时使用常量。
您可以在构造函数中使用parse_ini_file。
class ActivitycodesCollection {
var $list, $err, $sql;
const CONFIG_FILE = 'config.ini';
// --- Private variables for database access
var $_db_host = ''
var $_db_username = '';
var $_db_passwd = '';
var $_db_name = '';
public function ActivitycodesCollection() {
$config = parse_ini_file(self::CONFIG_FILE);
$this->_db_host = $config['db']['host'];
//etc
}
public function query ($where="") {
mysql_pconnect ($this->_db_host, $this->_db_username, $this->_db_passwd);
mysql_select_db ($this->_db_name);
$where = "WHERE " . $where;
$sql = "SELECT * FROM activitycodes $where";
$result = mysql_query ($sql);
$this->err = mysql_error();
$this->sql = $sql;
if (mysql_num_rows($result) > 0) {
while (list($id) = mysql_fetch_array ($result)) {
$this->list[$id] = new activitycodes($id);
}
}
}
ini文件应该是这样的:
[db]
host = localhost
name = foo
user = bar
pass = baz