PHP 对象序列化有多安全,跨页面传递是否安全? (使用 phpXMLrpc)
How secure is PHP object serialization and is it safe to pass across pages? (Using phpXMLrpc)
基本上这就是我正在做的事情:
我正在使用 PHPXMLRPC 与 Odoo 通信。
本质上,我需要发送的每个请求都需要遵循以下结构进行通信:
//The database I wish to connect too
$msg->addParam(new xmlrpcval($this->dbname, "string"));
//The logged in user id
$msg->addParam(new xmlrpcval($this->userID, "int"));
//The logged in users password
$msg->addParam(new xmlrpcval($this->password, "string"));
//The model
$msg->addParam(new xmlrpcval("project.project", "string"));
//The method Im requesting to call
$msg->addParam(new xmlrpcval("read", "string"));
//Query parameters
$msg->addParam(new xmlrpcval($id_list, "array"));
$msg->addParam(new xmlrpcval($field_list, "array"));
现在我写了一个 class,它在其构造函数中将实例变量设置为传递给其构造函数的值的实例变量,即
class PHPClient{
private $userName;
private $password;
private $dbname;
private $server_url;
private $userID;
public function __construct($server_url, $database, $user, $password)
{
$this->server_url = $server_url;
$this->dbname = $database;
$this->userName = $user;
$this->password = $password;
$this->userID = False;
}
有时我希望在其他地方再次使用同一个对象,也许是在另一个页面中。与其要求用户再次有效 "login" 并再次输入他们的所有详细信息,然后不得不创建另一个对象,不如序列化 PHPClient 对象并存储在会话中,然后存储在我需要使用的任何其他页面中是否足够安全该对象的序列化以验证用户是否已登录并具有足够的权限,然后反序列化该对象以执行任何进一步的 RPC 请求?
您可以安全地跨请求序列化。您甚至可以安全地将用户输入放入数据中,然后将其序列化。
但是,从不反序列化用户可能修改的数据。例如,永远不要反序列化 cookie 或表单负载,或其他服务器发送给您的任何内容。
所以是的,序列化以在会话中存储数据是绝对安全的。
我假设您正在讨论在 %_SESSION 变量中存储对象。此变量存储在服务器上,因此只能从服务器修改。因此会话与您的服务器一样安全。如果用户可以登录到您的服务器或通过应用程序错误导致您的服务器行为不正确,则该会话不是很安全。否则,它可能已经足够好了。
具体回答
How secure is PHP object serialization
序列化一点都不安全。它是数据的编码,而不是加密。任何人都可以反序列化、修改和重新序列化对象。所以序列化没有增加安全性。如果会话对您来说不够安全,那么您需要增加额外的安全性。
基本上这就是我正在做的事情:
我正在使用 PHPXMLRPC 与 Odoo 通信。
本质上,我需要发送的每个请求都需要遵循以下结构进行通信:
//The database I wish to connect too
$msg->addParam(new xmlrpcval($this->dbname, "string"));
//The logged in user id
$msg->addParam(new xmlrpcval($this->userID, "int"));
//The logged in users password
$msg->addParam(new xmlrpcval($this->password, "string"));
//The model
$msg->addParam(new xmlrpcval("project.project", "string"));
//The method Im requesting to call
$msg->addParam(new xmlrpcval("read", "string"));
//Query parameters
$msg->addParam(new xmlrpcval($id_list, "array"));
$msg->addParam(new xmlrpcval($field_list, "array"));
现在我写了一个 class,它在其构造函数中将实例变量设置为传递给其构造函数的值的实例变量,即
class PHPClient{
private $userName;
private $password;
private $dbname;
private $server_url;
private $userID;
public function __construct($server_url, $database, $user, $password)
{
$this->server_url = $server_url;
$this->dbname = $database;
$this->userName = $user;
$this->password = $password;
$this->userID = False;
}
有时我希望在其他地方再次使用同一个对象,也许是在另一个页面中。与其要求用户再次有效 "login" 并再次输入他们的所有详细信息,然后不得不创建另一个对象,不如序列化 PHPClient 对象并存储在会话中,然后存储在我需要使用的任何其他页面中是否足够安全该对象的序列化以验证用户是否已登录并具有足够的权限,然后反序列化该对象以执行任何进一步的 RPC 请求?
您可以安全地跨请求序列化。您甚至可以安全地将用户输入放入数据中,然后将其序列化。
但是,从不反序列化用户可能修改的数据。例如,永远不要反序列化 cookie 或表单负载,或其他服务器发送给您的任何内容。
所以是的,序列化以在会话中存储数据是绝对安全的。
我假设您正在讨论在 %_SESSION 变量中存储对象。此变量存储在服务器上,因此只能从服务器修改。因此会话与您的服务器一样安全。如果用户可以登录到您的服务器或通过应用程序错误导致您的服务器行为不正确,则该会话不是很安全。否则,它可能已经足够好了。
具体回答
How secure is PHP object serialization
序列化一点都不安全。它是数据的编码,而不是加密。任何人都可以反序列化、修改和重新序列化对象。所以序列化没有增加安全性。如果会话对您来说不够安全,那么您需要增加额外的安全性。