雖然國內很多PHP程序員仍在依靠addslashes防止SQL注入,還是建議大家加強中文防止SQL注入的檢查,addslashes的問題在 于黑客 可以用0xbf27來代替單引號,而addslashes只是將0xbf27修改為0xbf5c27,成為一個有效的多字節字符,其中的0xbf5c仍會被看作是單引號,所以addslashes無法成功攔截.
當然addslashes也不是毫無用處,它是用于單字節字符串的處理,多字節字符還是用mysql_real_escape_string吧.
打開magic_quotes_gpc來防止SQL注入,php.ini中有一個設置:magic_quotes_gpc = Off,這個默認是關閉的,如果它打開后將自動把用戶提交對sql的查詢進行轉換,比如把 ' 轉為 '等,對于防止sql注射有重大作用.
如果magic_quotes_gpc=Off,則使用addslashes()函數,另外對于php手冊中get_magic_quotes_gpc的舉例,代碼如下:
- if (!get_magic_quotes_gpc()) {
- $lastname = addslashes($_POST[‘lastname’]);
- } else {
- $lastname = $_POST[‘lastname’];
- }
最好對magic_quotes_gpc已經開放的情況下,還是對$_POST[’lastname’]進行檢查一下,再說下mysql_real_escape_string和mysql_escape_string這2個函數的區別.
mysql_real_escape_string 必須在(PHP 4 >= 4.3.0, PHP 5)的情況下才能使用,否則只能用 mysql_escape_string,兩者的區別是:mysql_real_escape_string 考慮到連接的當前字符集,而mysql_escape_string 不考慮.
(1)mysql_real_escape_string -- 轉義 SQL 語句中使用的字符串中的特殊字符,并考慮到連接的當前字符集.
使用方法,代碼如下:
$sql = "select count(*) as ctr from users where username02.='".mysql_real_escape_string($username)."' and 03.password='". mysql_real_escape_string($pw)."' limit 1";
PHP自定函數,代碼如下:
- function inject_check($sql_str) {
- return eregi('select|insert|and|or|update|delete|'|/*|*|../|./|union|into|load_file|outfile', $sql_str);
- }
- function verify_id($id=null) {
- if(!$id) {
- exit('沒有提交參數!');
- } elseif(inject_check($id)) {
- exit('提交的參數非法!');
- } elseif(!is_numeric($id)) {
- exit('提交的參數非法!');
- }
- $id = intval($id);
- return $id;
- }
- function str_check( $str ) {
- if(!get_magic_quotes_gpc()) {
- $str = addslashes($str); // 進行過濾
- }
- $str = str_replace("_", "_", $str);
- $str = str_replace("%", "%", $str);
- return $str;
- }
- function post_check($post) {
- if(!get_magic_quotes_gpc()) {
- $post = addslashes($post);
- } //開源代碼Vevb.com
- $post = str_replace("_", "_", $post);
- $post = str_replace("%", "%", $post);
- $post = nl2br($post);
- $post = htmlspecialchars($post);
- return $post;
- }
總結一下:
* addslashes() 是強行加;
* mysql_real_escape_string() 會判斷字符集,但是對PHP版本有要求;
* mysql_escape_string不考慮連接的當前字符集.
dz中的防止sql注入就是用addslashes這個函數,同時在dthmlspecialchars這個函數中有進行一些替換$string = preg_replace(/&((#(d{3,5}|x[a-fA-F0-9]{4}));)/, &1,這個替換解決了注入的問題,同時也解決了中文亂碼的一些問題.
新聞熱點
疑難解答