我已经得到了下面的代码,但我需要知道如何绑定它们以确保安全性。如果我只用$ new_row替换?并把它放在执行中我得到一个错误。谢谢你的帮助。
foreach my $field (@account_field_order) {
$new_row .= "'" . param($field) . "', ";
}#foreach
$new_row .= "'$status'";
my $dsn = "DBI:mysql:$database";
my $dbh = DBI->connect($dsn, $MYSQLuserid, $MYSQLpassword )
or die $DBI::errstr;
my $sth = $dbh->prepare(qq(INSERT INTO $table VALUES ($new_row) )) or die $DBI::errstr;
$sth->execute() or die $DBI::errstr;
答案 0 :(得分:5)
您将需要使用占位符,并且从不在字符串中插入变量。如果安全对您很重要,您应该在使用之前使用taint mode并对param
值进行去除污染。关于占位符的文档here。
尝试类似:
my @values = map param($_), @account_field_order; # add values to array
push @values, $status; # for simplicity
$new_row = join ", ", ("?") x @values; # add ? for each value
... # basically same code as before, except the execute statement:
$sth->execute(@values); # arguments given will be inserted at placeholders
答案 1 :(得分:0)
如果你的值是哈希值,那就是the insert_hash example in the docs(在prepare_cached下)。如果不使用数组,请根据需要进行调整。