gpt4 book ai didi

php - 使用 PDO 进行安全可靠的面向对象插入

转载 作者:行者123 更新时间:2023-11-29 02:28:10 25 4
gpt4 key购买 nike

使用 PDO 进行安全可靠的面向对象插入

此代码对 SQL 注入(inject)安全吗?它使用准备好的和参数化的语句。如果不是那么我应该怎么做,因为我只想通过面向对象的过程使用它,我可以在其中插入列名和列值。

    <?php

class CommunItY
{
const community_host = "localhost";
const community_db = "DB";
const db_username = "root";
const db_password = "";
private $conn = null;
public $trace = "";

public function insert($table ,$values = array())
{
try{
foreach ($values as $field => $v)
{
$ins[] = ':' . $field;
}
$ins = implode(',', $ins);
$fields = implode(',', array_keys($values));
$sql = "INSERT INTO $table ($fields) VALUES ($ins)";
$ready = $this->conn->prepare($sql);
foreach ($values as $f => $v)
{
$ready->bindValue(':' . $f, $v);
}
$ready->execute();
}
catch(Exception $e){
$this->trace .= " • insertion error • ". $e->getMessage();
}
}//end of method

public function __construct(){
$connectionString = sprintf("mysql:host=%s; dbname=%s; charset=utf8",
CommunItY::community_host, CommunItY::community_db);
try {
$this->conn = new PDO($connectionString, CommunItY::db_username, CommunItY::db_password);
$this->conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} //end of connection by PDO
catch(PDOException $e){
$this->trace .= " • ". $e->getMessage();
}
}//end of construct

public function __destruct(){
$this->conn = null; //close connection
} //end of destruct

}

calling...

$call = new Contact()
$call->insert(table_x, array('col1' => 'value1', 'col2' => 'value2'));

最佳答案

可能不会。您在字段名称中引入了注入(inject)。如果您可以保证字段名称始终由您的代码生成,而不是来自外部来源,那可能没问题。但这是一个公共(public)方法。因此,系统中的任何代码都可能会尝试做一些“聪明”的事情,并最终通过将参数传递给您的插入方法来打开一个漏洞。

您应该通过将传入的字段名称放在引号中来转义它们(或者如果您使用的是 MySQL 并且尚未启用 ANSI 兼容性,请使用 backtics)。您还必须转义名称中的任何引号。

$fields = implode(',', array_map(function($name) {
return '"' . str_replace('"', '""', $name) . '"' ;
}, array_keys($values)));

对于值,您应该只使用位置参数 (?) 或编写您自己的名称。我认为 PDO 没有转义 :bind_param 名称的机制。

另请注意,由于 PHP 对 7 位 ASCII 范围之外的字符的处理很糟糕,如果有人开始对字符串的内部字节编码进行捣乱,这可能仍然不是 100% 安全的。在这种情况下,唯一安全的方法是首先确保字段名称仅包含预期字符或根据众所周知的字段名称列表验证它们(可能通过使用 INFORMATION_SCHEMA 检查表列)。

关于php - 使用 PDO 进行安全可靠的面向对象插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17675145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com