用PHP函式解決SQL injection

2021-04-13 01:35:07 字數 1363 閱讀 9012

sql injection問題在asp上可是鬧得沸沸揚揚當然還有不少國內外著名的php程式「遇難」。至於sql injection的詳情,網上的文章太多了,在此就不作介紹。

如果你**空間的php.ini檔案裡的magic_quotes_gpc設成了off,那麼php就不會在敏感字元前加上反斜槓(/),由於表單提交的內容可能含有敏感字元,如單引號('),就導致了sql injection的漏洞。在這種情況下,我們可以用addslashes()來解決問題,它會自動在敏感字元前新增反斜槓。

但是,上面的方法只適用於magic_quotes_gpc=off的情況。作為乙個開發者,你不知道每個使用者的magic_quotes_gpc是on還是off,如果把全部的資料都用上addslashes(),那不是「濫殺無辜」了?假如magic_quotes_gpc=on,並且又用了addslashes()函式,那讓我們來看看:

<?php

//如果從表單提交乙個變數$_post['message'],內容為 tom's book

//這此加入連線mysql資料庫的**,自己寫吧

//在$_post['message']的敏感字元前加上反斜槓

$_post['message'] = addslashes($_post['message']);

//由於magic_quotes_gpc=on,所以又一次在敏感字元前加反斜槓

$sql = "insert into msg_table value('$_post[message]');";

//傳送請求,把內容儲存到資料庫內

$query = mysql_query($sql);

//如果你再從資料庫內提取這個記錄並輸出,就會看到 tom/'s book

?>

這樣的話,在magic_quotes_gpc=on的環境裡,所有輸入的單引號(')都會變成(

<?php

//如果magic_quotes_gpc=off,那就為提單提交的$_post['message']裡的敏感字元加反斜槓

//magic_quotes_gpc=on的情況下,則不加

if (!get_magic_quotes_gpc()) else {}

?> 其實說到這裡,問題已經解決。下面再說乙個小技巧。

有時表單提交的變數不止乙個,可能有十幾個,幾十個。那麼一次一次地複製/粘帖addslashes(),是否麻煩了一點?由於從表單或url獲取的資料都是以陣列形式出現的,如$_post、$_get)那就自定義乙個可以「橫掃千軍」的函式:

<?php

function quotes($content)

} else

} else

//返回$content

return $content;

}?>

用Oracle日期函式解決查詢難題

最近,筆者參與開發了乙個資訊管理系統,系統以oracle為資料庫後台,p owerbuilder 8為開發工具。筆者負責開發的查詢模組中需要乙個全域性函式,該函式能查詢某年 某月 某職工在某個城市的工作總天數,查詢僅涉及乙個表ryqxb,該錶記錄了人員去向,表結構如下 pepoleid 職工編碼,c...

用Oracle日期函式解決查詢難題

筆者負責開發的查詢模組中需要乙個全域性函式,該函式能查詢某年 某月 某職工在某個城市的工作總天數,查詢僅涉及乙個表ryqxb,該錶記錄了人員去向,表結構如下 pepoleid 職工編碼,city 所工作的城市,qssj 工作起始時間,zzsj 工作終止時間。查詢方案似乎很簡單 然後,利用sum函式,...

解決 php用ODBC連mysql錯誤2則

這和你的php有關。你的php沒有認出來這個函式,這是因為在php.ini中,很多的擴充套件 extension 前面都被加了分號 咱們要做的就是把這些分號去掉。乙個php 5.0 的php.ini大概長這樣 裡面加了 的就是沒有生效的。甚至,xampp自帶的php,居然都沒有某些必備的擴充套件的語...