避免删除API函数中的SQL注入


Avoiding SQL injection in delete API function

我正在尝试构建一个android应用程序,该应用程序的一部分涉及数据库上的CRUD选项,然后需要同步到服务器。我已经对CRU位进行了排序,但正在尝试以避免SQL注入的方式进行删除。

我已经为所有其他查询使用了准备好的语句,但我想知道以下不安全的方法是否安全:

我已经定义了一个删除查询有效的表列表,以及tableKey字段中可能存在的表主键列表。然后,我使用tableKeyValue字段中提供的值使用一个准备好的语句,并将操作限制为对单个用户的id进行操作。

从SQL注入的角度来看,这种方法是否安全,或者我是否应该为要删除的每个表设置特定的API端点,并只传递一个要在传统准备语句中使用的Id值?

    for ($i = 0; $i < count($deleteArray); $i++) {
        if (in_array($deleteArray[$i]['tableName'], $this->TABLE_ARRAY) && in_array($deleteArray[$i]['tableKey'], $this->KEY_ARRAY)) {
            $deleteStmtSQL = "DELETE FROM ".$deleteArray[$i]['tableName']." WHERE ".$deleteArray[$i]['tableKey']." = ? AND userId = ?";
            $deleteStmtSth = $this->dbh->prepare($deleteStmtSQL);
            $deleteStmtData = array(
                $deleteArray[$i]['tableKeyValue'],
                $userId
            );
            $deleteStmtSth->execute($deleteStmtData);
            $j++;
        }
    }

根据lxg和David的评论,这是我提出的解决方案:

我将tableNametableKeytableKeyValue传递到通用方法中,在确认tableNametableKey匹配后,将tableKeyValue传递到专用方法中

(例如deleteFromTableXByKey($tableKeyValue),然后使用准备好的语句,只将密钥作为值。

如果传递给tableNametableKey的父函数的值与预定义列表不匹配,则它们将在没有进一步交互的情况下传递,并返回错误消息。