[英]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.