📅  最后修改于: 2023-12-03 15:37:04.871000             🧑  作者: Mango
原型污染是指修改Object.prototype的对象或者污染全局对象的一个属性。如果我们不小心修改了Object.prototype或者其他原型对象的属性,那么这些修改会被其他所有基于该原型创建的对象所共享,从而导致全局变量的污染。
在C语言中,没有原型对象这一概念,但是我们可以通过指针操作来模拟原型污染。
在C语言中,我们通常使用结构体来模拟对象。下面是一个基本的例子:
typedef struct {
int x;
int y;
} Point;
假设我们想要为Point
对象添加一个draw()
方法,我们可以定义一个指向函数的指针并将其作为Point
的一个属性:
typedef struct {
int x;
int y;
void (*draw)(Point*);
} Point;
现在我们可以定义一个draw()
函数并将其分配给所有Point
对象的draw
属性:
void drawPoint(Point* p) {
printf("(%d, %d)\n", p->x, p->y);
}
Point p1 = { 10, 20, &drawPoint };
Point p2 = { 30, 40, &drawPoint };
p1.draw(&p1); // 输出 (10, 20)
p2.draw(&p2); // 输出 (30, 40)
现在假设我们意外地将p1
的draw
属性设置为NULL
:
p1.draw = NULL;
这就是原型污染的一个例子。如果我们在此之后调用p2.draw(&p2)
,它将尝试调用NULL
指针,从而导致程序崩溃。
避免原型污染的最好方法是仔细检查您的代码,确保您不会修改全局变量或修改对象原型。
在C语言中,您还可以考虑使用对象池或分配器来控制对象的创建和销毁。这将有助于您更好地控制对象属性的访问和修改。