下面的sql'update'查詢中使用了一個dbi占位符,以避免perl doc推薦的sql注入。我一直在查看stack-overflow和其他資源,以確定是否有任何遺漏。
#1
$sth = $dbh-> do("UPDATE $dbstore SET Classes='". $c_classes . "', zzzz='" . $c_zzzz . "', Timestamp='" . $timestamp . "' WHERE Host='" . $h_host . "'"); #old - working as expected.
#$sth = $dbh-> do("UPDATE $dbstore Set Classes=? , zzzz=? , Timestamp=? WHERE Host=? ", undef, $c_classes, $c_zzz, $timestamp, $h_host)。) #new。
#2>
$sth = $dbh-> do("UPDATE $dbstore SET Classes='". $c_classes . "', zzzz='" . $c_zzzz . "', Timestamp='" . $timestamp . "' WHERE Host='" . $h_host . "'"); #old - working as expected.
#$sth = $dbh-> do("UPDATE $dbstore Set Classes=? , zzzz=? , Timestamp=? WHERE Host=? ", undef, $c_classes, $c_zzz, $timestamp, $h_host)。) #new。
#3>
$sth = $dbh-> do("UPDATE $dbstore SET Warning='" . $st_warning . "' WHERE IDSID='" . $remote_user . "' AND Host='" . $st_host . "'"); #old - working as expected.
#$sth = $dbh-> do("UPDATE $dbstore Set Warning=? WHERE IDSID=? AND Host=?", undef, $st_warning, $remote_user, $st_host); #new
#4>
$sth = $dbh-> do("UPDATE $dbstore SET Warning='" 。$st_warning . "' WHERE IDSID='" . $remote_user . "' AND Host='" . $st_host . "'"); #old - working as expected.
#$sth = $dbh-> do("UPDATE $dbstore Set Warning=? WHERE IDSID=? AND Host=?", undef, $st_warning, $remote_user, $st_host); #new
#5>
$sth = $dbh-> do("UPDATE $dbxxxx SET Nodes='submitted (" . $timestamp . " by " . $remote_user . ")', Configuration='" . $st_configuration . "' WHERE Host='" . $st_host . "'"); #old - working as expected.
#$sth = $dbh-> do("UPDATE $dbxxxx SET Nodes='submitted (? by ?)', Configuration=? WHERE Host=? ", undef, $timestamp, $remote_user, $st_configuration, $st_host)。) #new。
#6>
$sth = $dbh-> do("UPDATE $dbxxxx SET Classes='" . $n_classes_update 。"' WHERE Host='" . $st_host . "'"); #old - working as expected.
#$sth = $dbh-> do("UPDATE $dbxxxx SET Classes=? WHERE Host=?", undef, $n_classes_update, $st_host); #new
根據我的理解和閱讀(可能是錯誤的),沒有必要用單/雙引號來包圍變數。 這是一個真實的說法嗎?
我對第5個問題 "提交(?由?) "部分最懷疑。在這種情況下,將?放在單引號內是否會導致問題? 如果是,建議的解決方案是什么?
你是否在其他查詢中偶然發現了任何問題?
謝謝
uj5u.com熱心網友回復:
你已經知道了,#5是問題所在。
$dbh->do("UPDATE $dbxxxx SET Nodes='Submitted (?by ?)'", $timestamp, $remote_user)/code>
上面設定了字串Submitted (?by?)。
一個占位符是用于一個單一的SQL值。你建立了這個字串并將其傳入。
你也會想要建立這個字串。
你還想在表名上使用quote_identifier。這將參考和轉義任何識別符號、列和表名,以避免SQL注入。
my $q_table = $dbh-> quote_identifier($dbxxxx) 。
$dbh->do("UPDATE $q_table設定Nodes=? ", {}, "提交($timestamp by $remote_user)")。
注意,你應該得到一個警告或錯誤,即在陳述句中傳遞了太多的引數(我可能是錯的,我已經很久沒有使用DBI了),所以你要調查為什么沒有發生。如果可能的話,把RaiseError打開,這樣你就可以立即把這些SQL故障作為錯誤得到。
my $dbh = DBI->connect(
$data_source, $username, $password, { RaiseError = 1 }
);
SQL設計說明。避免存盤格式化的資料。它使搜索變得緩慢和復雜,增加了表的大小,并限制了你的輸出格式。
在輸出時對其進行格式化。例如......
update some_table set submitted_at=?, remote_user=?
select concat('submitted (', submitted_at, ' by ', remote_user, ') ')
from some_table;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/311324.html
標籤:
