Php Yii模型中的ID属性是否受保护不可编辑?

Php Yii模型中的ID属性是否受保护不可编辑?,php,activerecord,yii,model,Php,Activerecord,Yii,Model,我使用从ActiveRecord继承的giix创建了一个简单的Yii模型。使用rules函数,我定义了某个值是不安全的,因此不能更改它,因为它指示它属于哪个用户。提交表单时,它会通过表单发送数据的id,以将更改应用到正确的数据集。如果更改此id会发生什么情况?如果这是Yii找到数据的唯一方法,你可以改变随机的东西吗?或者Yii是否使用内置功能自动检查该功能 顺便说一句,因为我使用了defaultScope,所以您只能获得属于特定用户的结果,但是defaultScope仅适用于选择查询,而不适用于

我使用从ActiveRecord继承的giix创建了一个简单的Yii模型。使用rules函数,我定义了某个值是不安全的,因此不能更改它,因为它指示它属于哪个用户。提交表单时,它会通过表单发送数据的id,以将更改应用到正确的数据集。如果更改此id会发生什么情况?如果这是Yii找到数据的唯一方法,你可以改变随机的东西吗?或者Yii是否使用内置功能自动检查该功能

顺便说一句,因为我使用了defaultScope,所以您只能获得属于特定用户的结果,但是defaultScope仅适用于选择查询,而不适用于插入、删除或更新

编辑:

我更改了URL中提交的ID。现在它指向一个不同的记录。此记录不会指定特定的用户值。然而,我想我并没有对照这一点进行检查,所以我仍然能够编辑该记录,仅仅通过更改URL中给定的ID吗


感谢您的建议和回答:)

也许我误解了您的问题,但我认为您可能不清楚不安全验证器在Yii中是如何工作的

请查看验证文件

基本上,当您从数据库获取一条记录到ActiveRecord模型中时,该模型的所有属性都将从数据库值中填充。但是,如果在指定记录ID的表单上没有输入(也不应该有,因为它通常是该数据库表的主键),那么在提交表单时,它将不会在模型中或数据库中更新

换句话说,假设我有一个具有以下特征的表:

CREATE TABLE `users` (
`id` mediumint(9) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`username` varchar(39) NOT NULL UNIQUE,
`password` varchar(39) NOT NULL,
然后我创建了一个表的模型,它将被所有三列所填充,用于它提取的任何记录。然而,如果我要创建一个“更新您的密码”表单,我永远不会添加ID行。因此,当我提取一条记录并将其保存在模型中,然后更新该模型中的密码值时,ID属性永远不应该向最终用户公开

现在,当我在提交表单后保存记录时:

if (isset($_POST['MyForm'])) {
    $model->attributes = $_POST['MyForm'];
    $model->save();
}
在保存之前,首先要对模型运行任何验证规则,这是正确的。但是我应该设置验证规则的唯一项目是那些可能有不正确或不完整的用户输入的项目。因此,这样做可能是有意义的:

public function rules()
    {
        return array(
            array('username', 'match', 'pattern'=>'/^[a-z0-9_-]{6,100}$/i', 'message' => 'Come on now, make a name that makes sense!'),
            array('password', 'match', 'pattern'=>'/^[\w\d]{6,18}$/', 'message' => 'Don\'t use special characters in your password!'),
    }
这两种方法都会检查用户名和密码是否符合模式(请原谅任何正则表达式的拼写错误,但乍一看是正确的)

但是如果我将一个属性声明为,会发生什么呢?所做的一切就是阻止我使用大量赋值将表单中发布的值设置到模型中

因此,如果我要用以下内容更新规则():

然后,在提交表单时,调用将模型中的所有属性设置为表单值:

$model->attributes = $_POST['MyForm'];
不安全属性(在本例中为用户名)将不会被设置


但这对ID来说并不重要,因为它无论如何都不应该出现在表单中。在执行查询时,它可能已经从数据库中提取出来,或者(使用正确的模式定义)在将新记录插入数据库时自动创建。

我添加了一些额外的解释,也许现在更清楚了。我不得不承认,这有点困惑:PNo,yi无法确定URL是否已被手动更改,除非您输入一些代码进行检查。您可以使用Yii,您可以将其放置在模型中并设置为执行检查,以查看是否允许用户访问某些页面。此外,最好的感谢是投赞成票或接受答案好的,非常感谢,这正是我需要知道的:D答案被标记为已接受,需要更多的声誉来提升它:P将尽快完成;)所以非常感谢你!“但这与ID无关,因为它无论如何都不应该出现在表单中。”-这句话在涉及黑客注入的数据发布时是非常错误的-这将非常重要,然后只是说;)
$model->attributes = $_POST['MyForm'];