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

时间:2014-10-09 19:01:23

标签: php mysql sql security mysqli

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

我已经为所有其他查询使用了预处理语句,但我想知道以下方法是否安全:

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

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

    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++;
        }
    }

1 个答案:

答案 0 :(得分:0)

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

我将tableNametableKeytableKeyValue传入一个通用方法,在确认tableNametableKey匹配后,将tableKeyValue传递给私有方法

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

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