在下面给出的代码中,我试图以这样的方式修改它,即从配置文件中使用db连接变量。这应该使密码更安全,因为我可以限制配置文件的权限。
请告诉我是否有办法修改代码以从其他文件/配置文件中获取db变量?
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
答案 0 :(得分:1)
如果没有看到“config”文件,就无法说出如何为它编写解析器。一个简单的解决方案是编写一些设置变量的PHP代码 - 但是如果你包含/要求它,变量将在全局范围内设置 - 而不是在方法中。但是你可以使用eval(file_get_contents($ config_file_path)) - 它会在本地范围内设置变量,但却有提供代码注入方法的风险。
BTW您提供的代码存在大量问题。暂且不考虑SQL注入的潜在风险,如果方法参数为null / blank,那么查询将是格式错误的(考虑函数查询($ where =“1”)。依赖于特定的列排序是不好的做法。
当唯一可行的方法是通过suphp或base opendir时,很难想象你如何限制对这个配置文件的访问。
答案 1 :(得分:1)
你的代码已经过时了
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);
}
}
}
}
答案 2 :(得分:0)
您可以在构造函数中使用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
答案 3 :(得分:0)
将SQL连接数据放在单独的文件中根本不会提高安全性。实际上,将它们存储在没有.php
扩展名的文件中会降低安全性,因为用户可以访问它,而PHP文件的代码对任何用户都不可见。您也不能在配置文件上使用比PHP文件更严格的权限,因为PHP运行的任何用户(通常是Web服务器用户)都需要访问它们。
只需将连接数据存储在PHP文件中:
<?php
define('DB_HOST', '...');
define('DB_NAME', '...');
define('DB_USER', '...');
define('DB_PASS', '...');
然后包含此文件(在类定义之外)并在建立连接时使用常量。