【发布时间】:2012-07-20 01:31:27
【问题描述】:
我想知道将诸如散列和加密之类的东西嵌入到较低级别代码中的常见做法。似乎最好使用某种对象或宏约定,以便在发现漏洞并提高效率时可以轻松评估和更新安全功能。例如,我在处理身份验证的 PHP 代码中看到了以下约定(博客、代码峡谷、框架 wiki 等)……这里有一个虚构的例子来说明这一点。
if ($myhash !== md5(shaX($this->key) . blah($this->salt) . blah($this->var))
与其把它埋得很深,这不是更好吗
if ($myhash != MY_HASH($key))
在配置文件或其他易于访问的对象中使用 MY_HASH,从而在可用时更容易更新/维护并提高安全性?为什么不将任何加密或散列的金块放入仅包含转换函数的配置文件或特殊散列文件中?
另外 - 考虑数据库访问。 PHP 有很多抽象,但我看到应用程序这样做:
// grab some data from the database
if ($this->mongo_flag)
{
$this->mongo_abstraction
->where($blah1, $x)
->update($blah2);
}
elseif ($this->mysql_flag)
{
$this->mysql_abstraction
->where($blah1, $y)
->update($blah2);
}
elseif ($this->couch_flag)
{
$this->couch_abstraction
->where($blah1, $z)
->update($blah2);
}
也许只有 x,y,z 不同。
不能实例化一个预先具有正确 db 方法的对象,从而消除 if/else 逻辑,该逻辑在进行数据库访问的任何地方都会重复?
即
$mydata = $this->db_get_method($blah1, $blah2);
或
$mydata = $DB_GET_METHOD($db_type, $blah1, $blah2);
如果首选 if/else 区分,那么您似乎应该跳过抽象的东西,而只使用原生 API,使其更高效、更易于维护,因为原生 api 可能不会改变并且抽象通过调出每种可能的数据库类型,大多数情况下都无效/无效。还是不行?
我的主要经验是实时嵌入式 C 编程(很多 PHP 代码看起来像用全局结构设计的过程 C)所以我想知道性能是否可能是最终答案,即它只是以这种方式运行得更快?对象是否会引入过多的延迟/复杂性?
【问题讨论】:
-
在我看来 PHP 开发人员对密码哈希函数的想法是一样的,php 5.5 的 rfc 将引入 password_hash() 函数以简化整个哈希过程:wiki.php.net/rfc/password_hash
-
正如@complex857所说,使用密码_*
标签: php mysql security authentication mongodb