簡體   English   中英

為什么不應該將CONCAT()用於靜態字符串文字呢?

[英]Why should you not use CONCAT() for static string literals?

所以你有了

$sql = "SELECT * FROM `table` WHERE `some_text_field` LIKE CONCAT('%', ?, '%')";
$stmt = $dbh->prepare($sql);
$stmt->execute(array($_POST['badies_code']));

看着另一個問題,我發現這會引起安全隱患,但是為什么呢?

我找到了這個問題,一個低調的答案和一個高調的評論,這就是為什么我問

評論說

這不是執行此操作的正確方法。 您不應將CONCAT()用於三個靜態字符串文字,因為它會使您接觸到特定類型的SQL注入(我忘記了名稱)。 –西奧多·R·史密斯

PHP PDO准備的語句-mysql LIKE查詢

記住不存在的注入名稱將是一項非常復雜的任務。

concat()與預處理語句一起使用沒有任何錯誤。

我認為@ TheodoreR.Smith可能意味着Oracle數據庫[1] [2]中的所謂的橫向SQL注入

它通過更改環境變量來工作,這些環境變量保存諸如NLS_DATE_FORMATNLS_NUMERIC_CHARACTERS類的格式信息,然后在用於動態構建和執行語句的存儲過程中使用(這是使用字符串連接的地方,用||運算符表示):

CREATE OR REPLACE PROCEDURE date_proc IS
    stmt VARCHAR2(200);
    v_date DATE := SYSDATE;
BEGIN
    stmt := 'select object_name from all_objects where created = ''' || v_date || '''';
    EXECUTE IMMEDIATE stmt;
END;

此處SYSDATENLS_DATE_FORMAT指定的格式返回當前日期。 盡管該過程沒有參數,但是將日期格式更改為' or 1=1--

ALTER SESSION SET NLS_DATE_FORMAT = ''' or 1=1--'

結果語句為:

select object_name from all_objects where created = '' or 1=1--'

此環境變量操作特定於Oracle數據庫。 同樣,可以使用准備好的語句來減輕它:

CREATE OR REPLACE PROCEDURE date_proc IS
    stmt VARCHAR2(200);
    v_date DATE := SYSDATE;
BEGIN
    stmt := 'select object_name from all_objects where created = :date';
    EXEC SQL PREPARE prepared_stmt FROM :stmt;
    EXEC SQL EXECUTE prepared_stmt USING :v_date;
end;

我不知道MySQL很容易進行這種環境變量操作。

但是,無論是在應用程序中還是在數據庫中發生,沒有適當處理就動態地構建語句都容易產生SQL注入。 因此,在存儲過程中使用准備好的語句也是必須的。

暫無
暫無

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

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