我正在尝试构建一个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++;
}
}
答案 0 :(得分:0)
根据lxg和David的评论,这是我提出的解决方案:
我将tableName
,tableKey
和tableKeyValue
传入一个通用方法,在确认tableName
和tableKey
匹配后,将tableKeyValue
传递给私有方法
(例如deleteFromTableXByKey($tableKeyValue)
然后使用准备好的陈述,只将密钥作为值。
如果传递给tableName
和tableKey
的父函数的值与预定义列表不匹配,则它们会在没有进一步交互的情况下通过,并返回错误消息。