SQL预处理语句和str_replace()的组合 - 是否安全?

时间:2016-08-14 07:46:51

标签: php sql prepared-statement

此代码检查表单输入值是否为空,如果是,则更新相关行(id)的相关MySql列。

在准备好的语句上运行的str_replace()(用于循环遍历列)是否容易受到攻击?

这段代码安全吗?有更好的选择吗?

// get submitted form values
$ids = $_POST['ids_edit_mult'];    
$exhibition_he = $_POST['exhibition_he_edit_mult'];
$subjects_en = $_POST['subjects_en_edit_mult'];
$subjects_he = $_POST['subjects_he_edit_mult'];
$keywords_en = $_POST['keywords_en_edit_mult'];
$keywords_he = $_POST['keywords_he_edit_mult'];
$year = $_POST['year_edit_mult'];
$sold = $_POST['sold_edit_mult'];

$columns_array = array("exhibition_he", "subjects_en", "subjects_he", "keywords_en", "keywords_he", "year", "sold");
$values_array = array($exhibition_he, $subjects_en, $subjects_he, $keywords_en, $keywords_he, $year, $sold);
$ids_array = explode(", ", $ids);

for ($i1=0; $i1 < count($values_array); $i1++) {
if ($values_array[$i1] != "") {
    for ($i2=0; $i2 < count($ids_array); $i2++) {

        // prepare statement for editing row values ($stmt1)
        $sql_string = "UPDATE paintings_catalog SET column=? WHERE id=?";
        $sql = str_replace("column", $columns_array[$i1], $sql_string);
        $stmt1 = $conn->prepare($sql);

        // bind submitted row values
        $stmt1->bind_param("si", $values_array[$i1], $ids_array[$i2]);

        // edit row values
        $stmt1->execute();
       }
    }
 }

1 个答案:

答案 0 :(得分:0)

如果这是你的价值,你替换它是安全的,如果它的用户价值你正在替换,而不是安全。在您的情况下,您将使用预定义的值替换,这意味着用户无法更改它们。

简短回答 - 针对您的案例 SAFE