Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php身份验证/数据库代码样式_Php_Mysql_Security_Authentication_Mongodb - Fatal编程技术网

php身份验证/数据库代码样式

php身份验证/数据库代码样式,php,mysql,security,authentication,mongodb,Php,Mysql,Security,Authentication,Mongodb,我想知道在底层代码中嵌入哈希和加密之类的东西的常见做法。似乎最好使用某种对象或宏约定,以便在发现漏洞和提高效率时轻松评估和更新安全功能。例如,我在处理身份验证的PHP代码中看到了以下约定(博客、代码峡谷、框架wiki等)。。。下面是一个虚构的例子来说明这一点 if ($myhash !== md5(shaX($this->key) . blah($this->salt) . blah($this->var)) 与其把它埋得深一点,这不是更好吗 if ($myhash != M

我想知道在底层代码中嵌入哈希和加密之类的东西的常见做法。似乎最好使用某种对象或宏约定,以便在发现漏洞和提高效率时轻松评估和更新安全功能。例如,我在处理身份验证的PHP代码中看到了以下约定(博客、代码峡谷、框架wiki等)。。。下面是一个虚构的例子来说明这一点

if ($myhash !== md5(shaX($this->key) . blah($this->salt) . blah($this->var))
与其把它埋得深一点,这不是更好吗

if ($myhash != MY_HASH($key))
在配置文件或其他易于访问的对象中使用MY_散列,从而在可用时更容易更新/维护并具有更好的安全性?为什么不将任何加密或哈希的块放入只包含转换函数的配置文件或特殊哈希文件中

也考虑数据库访问。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逻辑吗?if/else逻辑在数据库访问的任何地方都会重复

i、 e

如果首选if/else区分,那么您似乎应该跳过抽象内容,只使用本机API,使其更高效、更易于维护,因为本机API可能不会更改,并且通过调用每种可能的数据库类型,抽象基本上是无效的。还是不


我的主要经验是使用实时嵌入式C编程(很多PHP代码看起来像是用全局结构设计的过程C),所以我想知道性能是否是最终的答案,也就是说,这样运行会更快?对象是否会带来太多的延迟/复杂性?

我喜欢你的建议。特别是对于散列,我认为将其封装到一个易于访问的位置是明智的。我也喜欢您关于调用db方法的建议。然而,用PHP来做你所建议的事情需要进行反思,这会带来性能问题,请看这篇文章。对性能的影响似乎并不太坏,但性能仍然有所下降。我认为实现db方法调用的更好方法是使用OOP继承,而不是传递动态方法。每个数据库都应该有一个不同的对象。

正如@complex857在他的评论中所说的,PHP在简化哈希过程方面做出了一些努力。无论如何,您可以自己做(普通函数或更复杂的类)

也许我没有正确地理解您,但是关于数据库抽象,使用PHPPDO(以及PEAR的DB和MDB2),您可以为特定的数据库引擎构建一个对象,之后,方法大致相同(只有在处理任何引擎的特定功能时才会出现差异)


关于PHP还有一个大问题:有时你会偶然发现一些写得非常糟糕的脚本,可能是由业余程序员编写的。因此,如果您多次看到相同的错误实践,并不意味着没有更好的方法使用PHP。还要考虑到这些脚本可能有多老:PHP在它的生命周期中已经有了很大的发展。

身份验证和数据库抽象都是常见的痛点。程序员的自大或缺乏经验确实会导致大量糟糕的再创造(偶尔也会导致有用的创新)

就数据库抽象而言,当后端实现显著不同时,您的示例很快就会崩溃。例如,NoSQL数据库(如Coach或MongoDB)的查询语言和数据建模与SQL数据库使用的传统关系查询不匹配。您最终会遇到这样一个问题:您要么使用一个“通用”接口,其中有很多关于什么适用于给定后端的警告。。或者是严重限制的最低公分母。这是……的一个常见问题。。它们通常很难表示连接或子选择,而连接或子选择并不完全适合预期的ObjectClass数据库表映射

即使在“类似”的产品(如支持公共关系语言的数据库)中也是如此。每个数据库通常都有自己的SQL方言,这些方言通常从支持的数据类型开始出现差异,并且随着实现扩展到更高级的功能(如触发器、存储过程和视图),差异会更大

从您的其他示例来看,您还遇到了一些开发人员在实现自己的抽象方面做得很差的问题

如果性能是一个问题,那么最好的结果可能是针对特定的数据库后端进行优化,并利用独特的功能


如果优先考虑支持各种数据库后端,则有标准的关系接口,如、或。数据库抽象的一个新兴类别是用于NoSQL数据库(如MongoDB和Coach)的ODM(对象文档映射器)。

在我看来,PHP开发人员对密码散列函数的想法也是一样的,PHP5.5的rfc将引入密码散列()函数简化整个散列过程:正如@complex857所说的,使用密码_*
$mydata = $this->db_get_method($blah1, $blah2);
$mydata = $DB_GET_METHOD($db_type, $blah1, $blah2);