RedBean PHP:有没有办法保护数据库列不被更改? (例如:插入日期)
Posted
技术标签:
【中文标题】RedBean PHP:有没有办法保护数据库列不被更改? (例如:插入日期)【英文标题】:RedBean PHP: Is there a way to protect a database column from being changed? (ex: insertion_date ) 【发布时间】:2011-09-21 10:31:50 【问题描述】:已经使用了尽可能多的 ORM。目前,我对 RedBean php 爱不释手。我们开始吧......经过几个小时的研究后,我怀疑解决这个非常基本的问题的更好方法是什么(在这种情况下,最好的方法意味着更适合 RedBean 的易用性理念的方法):
限制对类的某些属性的访问是很常见的,这样我们就可以防止某些类型的错误数据操作。这通常是通过充分利用 getter 和 setter 来实现的。但就 RedBean 所知,在原生类中没有正式的 setter,只有一些可以更改和持久化在数据库中的公共属性。
我想做的是保护一些属性不被手动更改,这样我就可以避免其他程序员做出任何奇怪的事情,比如:
$beam->insertion_date = 'yesterday';
R::store($beam);
显然,在插入行后该字段永远不应更改,但我们不能相信没有人会这样做。有没有办法实现诸如将插入日期变为受保护属性或以某种方式使其无法访问?
我觉得最好的方法是使用$beam->setMetadata()
并声明不应该更改给定的属性,但我不知道如何在 RedBean 中实现这一点并且仍然找不到足够的官方手册中的信息。任何帮助表示赞赏。
感谢阅读。
【问题讨论】:
【参考方案1】:保护您的数据库免受未经授权或意外修改的唯一防弹方法是使用数据库的权限系统(GRANT
和REVOKE
),通过使用具有特定权限的不同用户配置文件,直至列级别等。
也许不容易实现,但在(定制的)代码中保留特权总是会有漏洞。
【讨论】:
嗨@fvu,感谢您的回复。你所说的防弹解决方案是无可争议的,但正如我所说,我想保持 ORM 的易用性理念,并通过 ORM 接口本身进行这种配置。也许我应该更好地澄清一下,我对这个问题的唯一兴趣是防止通过 Redbean ORM 以编程方式进行的过度数据更改,而不是使用外部数据库工具进行的更改。 我投了赞成票,因为我还没有想到一个主题的信息价值:您为数据库数据保护提出的更“防弹”解决方案,这对我来说非常有用。 【参考方案2】:另一种方法是将列的数据类型设置为具有指定状态的类型。
例如,如果您将 varchar(255) 更改为 varchar(254),RedBeanPHP 将发现更改并保留该列,因为它现在是一个指定的列,例如,对于 int,您可以使用 INT(10)。特殊类型永远不会被转换:ENUM/DATE 等。
【讨论】:
【参考方案3】:找到了解决办法!
-
在您的模型上,每次从数据库加载 bean 时,将 bean 的状态存储在私有属性中。
在将内容放回数据库之前,测试不应该更改的值是否以编程方式更改。
在肯定的情况下,抛出异常或添加任何其他事件到 警告程序员他们正在尝试更改可能通过 错误不应该更改的字段。这就是示例模型现在的样子:
class Model_book extends RedBean_SimpleModel
protected $before = false;
public function open()
if($this->bean->id)
$this->before = clone($this->bean);
public function update()
if($this->bean->id)
if($this->before->insertion_date != $this->bean->insertion_date)
throw new exception ("The insertion_date can't be changed.");
所以现在下面的代码会导致异常:
$beam->insertion_date = 'yesterday';
R::store($beam);
注意:使用 RedBean 的元信息 API 会更好 解决方案,但添加(仅)此验证没有意义 标准而不在 RedBean 之上添加完整的验证层。在 另一方面,添加自定义完整验证将变得无用 以防在不久的将来将内置验证添加到 ORM(我 打赌它会发生),所以我暂时保持原样。
希望对您有所帮助。
【讨论】:
以上是关于RedBean PHP:有没有办法保护数据库列不被更改? (例如:插入日期)的主要内容,如果未能解决你的问题,请参考以下文章