簡體   English   中英

用戶提供的輸入SQL轉義

[英]User provided input SQL-escaping

你能給我建議嗎? 我搜索了問題,但沒有發現類似的東西。

當我打算在SQL查詢中使用我的用戶輸入時,如何使它們自動轉義? 我不喜歡在代碼中填充類似

$var_x = $DB->Escape($_POST['var_x']);
$another_var = $DB->Escape($_POST['another_var']);
$some_string = $DB->Escape($_POST['some_string']);
...

假設我有使用Escape方法執行MySQL_real_escape_string的數據庫類

但是我也不能在SQL查詢上設置自動轉義,因為它會破壞插入查詢:

function Exec($sql){
   $result = mysql_query($this->Escape($sql));
}

$q = $DB->Exec("SELECT * FROM table WHERE id = 'xxx'");

它使它們為\\'xxx \\'。 這是不正確的。

我要做的最后一件事是使參數化的語句,因為它將使系統更加復雜。 當別無其他東西時,我將考慮使用此選項。

簡而言之-如何使智能自動轉義適用於整個查詢並且僅轉義值?

實際上,您應該考慮的唯一且唯一的事情(顯然不是在這里談論測試項目)是使用參數化語句。 這是唯一的方法(當然,當SQL synax允許它們時)。 處理得當,這不會讓你的系統更復雜,但他們使其更加堅固。

抱歉,您無法執行任何操作。 當串聯字符串時,那里總是會有字符轉義的問題。 這不是您可以一次解決的事情,而無需再考慮。

如果您這樣做:

$a= "a'b";
$query= "SELECT * FROM things WHERE name='$a'";

然后,您的查詢字符串既包含作為字符串文字中的實際撇號的撇號,也包含作為字符串定界符的撇號:

SELECT * FROM things WHERE name='a'b'

一個需要逃脫; 另一個不能。 你怎么知道哪個是哪個? 您不能,那信息永遠丟失。 您必須改為說:

$query= "SELECT * FROM things WHERE name='".mysql_real_escape_string($a)."'";

(或其他更適合您使用的數據庫的轉義功能。)

丑陋? 真是的 這就是為什么我們改用參數化查詢的原因。 這擺脫了字符串連接帶來的所有麻煩。

字符串連接看起來很容易。 人們認為他們了解一起串起字符串。 但實際上,他們沒有。

我使用這種方法:

$db->set('name',$name);
$db->set('title',$title);
$db->insert('users');

這里的$db->set()方法自動轉義該值(即第二個參數)。

使用PHP 5,您還可以執行以下操作:

$db->set('name',$name)->set('title',$title)->insert('users');

我要做的最后一件事是使參數化的語句,因為它將使系統更加復雜。 當別無其他東西時,我將考慮使用此選項。

要說明您的觀點,即參數化查詢“更復雜”? 我不串聯外部數據導入查詢- 永遠 -這是在世界上最簡單的事情,以及作為遠遠超過任何逃避技術更接近“防彈”是有史以來可能。

暫無
暫無

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

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