簡體   English   中英

轉義字符串在Perl中引用

[英]Escaping string to be quoted in Perl

我正在編寫一個快速的Perl腳本,該腳本需要用戶輸入並將其用作MySQL正則表達式。 我想確保我可以通過它,而不會出現任何Bobby表廢話。 特別是,我要允許各種特殊字符,同時拒絕任何可能超出引號本身的內容。

代碼是這樣的:

my $myRegex = join(' ', @ARGV);
# ...other code...
sendToSQL("select blah from foo where bar regexp '$myRegex'");

特別是,我需要像\\(...\\)\\.這樣的構造\\. 保留-我無法將它們更改為\\\\\\(...\\\\\\)\\\\. 感覺這已經足夠簡單了,應該已經存在了-我試圖在這里不重新發明輪子。

該腳本僅通過SSH接收來自受信任用戶(包括我在內的三個用戶之一)的輸入,因此“原則上”,我可以不加檢查就傳遞字符串。 但是,如果它捕獲了誠實的錯誤,而不是不經意間將部分命令泄漏給SQL並產生奇怪的結果,我會感覺好多了。 (這本身不是安全問題有權訪問腳本的用戶已經可以直接運行mySQL。)

編輯:建議的副本僅與我的問題稍有相關,當然也不能重復。 我沒有使用DBI,我的關注點不是注入式攻擊-關心的是用戶不會無意中引起數據庫副作用,而不是敵意的一方在其上運行惡意代碼。 (為了使用腳本,您需要已經可以直接訪問MySQL,在這種情況下,您可以對數據庫進行任意更改。)

my $sth = $dbh->prepare("select blah from foo where bar regexp ".$dbh->quote($myRegex));
$sth->execute();

要么

my $sth = $dbh->prepare("select blah from foo where bar regexp ?");
$sth->execute($myRegex);

請注意,正則表達式很昂貴,因此這仍然會對服務器產生不利影響。

如果不能使用帶有綁定占位符的預處理語句,那么您當然需要“轉義” SQL文本中提供的潛在不安全值。

唯一需要轉義的字符是反斜杠字符和用於將字符串括起來的引號字符。

您使用單引號將值括起來。 正則表達式中的反斜杠字符必須在另一個反斜杠字符之前。 並且由於您使用單引號將字符串括起來因此值中的任何單引號都必須在其后加上反斜杠字符。

您可以轉義其他字符,例如雙引號,但是在您的特定情況下,這並非絕對必要。 但是逃脫雙引號字符不會有任何傷害。

編寫sendToSQL函數的人也應該提供相應的escapeForSQL函數作為DBI“ quote”函數的包裝器:

sendToSQL("select blah from foo where bar regexp '" . escapeForSQL($myRegex) . "'");

正確的方法是遵循bobby-tables.com上建議,並在查詢中使用占位符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM