2012-05-07 120 views
-6

可能重複: How to include a PHP variable inside a mysql insert statement如何使用此功能

如何使用這個功能來清理這是一個從一個URL中提取的變量?假設我有一個$id變量,它是從「www.mydomain.com/single-page?id=534」中提取的,我希望在將它用於MySQL select語句之前使其變得安全。

<?php 
    class SecureSqlInjection 
    { 
     function specificData($val) 
     { 
      $val = htmlspecialchars(stripslashes(trim($val))); 
      $val = str_ireplace("script", "blocked", $val); 
      $val = mysql_escape_string($val); 
      return $val; 
     } 

     function secureSuperGlobalGET(&$value, $key) 
     { 
      if(!is_array($_GET[$key])) 
      { 
       $_GET[$key] = htmlspecialchars(stripslashes($_GET[$key])); 
       $_GET[$key] = str_ireplace("script", "blocked", $_GET[$key]); 
       $_GET[$key] = mysql_real_escape_string($_GET[$key]); 
      } 
      else 
      { 
       $c=0; 
       foreach($_GET[$key] as $val) 
       { 
        $_GET[$key][$c] = mysql_real_escape_string($_GET[$key][$c]); 
        $c++; 
       } 
      } 
      return $_GET[$key]; 
     } 

     function secureSuperGlobalPOST(&$value, $key) 
     { 
      if(!is_array($_POST[$key])) 
      { 
       $_POST[$key] = htmlspecialchars(stripslashes($_POST[$key])); 
       $_POST[$key] = str_ireplace("script", "blocked", $_POST[$key]); 
       $_POST[$key] = mysql_real_escape_string($_POST[$key]); 
      } 
      else 
      { 
       $c=0; 
       foreach($_POST[$key] as $val) 
       { 
        $_POST[$key][$c] = mysql_real_escape_string($_POST[$key][$c]); 
        $c++; 
       } 
      } 
      return $_POST[$key]; 
     } 

     function secureGlobals() 
     { 
      array_walk($_GET, array($this, 'secureSuperGlobalGET')); 
      array_walk($_POST, array($this, 'secureSuperGlobalPOST')); 
     } 
    } 
?> 
+0

呃...使用超級全球變現爲你自己的數據... – Tibor

+1

你的問題到底是什麼? [所以]是**不**代碼審查工具。你有什麼錯誤嗎? – Lix

回答

7

爲了防止SQL注入攻擊,你應該逃出的數據,你在構建查詢時從用戶處獲得,例如使用:

$query = "SELECT * FROM `users` WHERE `id` = '" . 
    mysql_real_escape_string($_POST['id']) . "'"; 

(注意周圍的值的單引號)。

一個更好的主意又是使用prepared SQL statements。無論如何,魔術引號已被棄用,因此無需使用stripslashes()和超級全局變量以及所有這些技巧。

此外,請僅在輸出時使用htmlspecialchars()。現在你實際上已經在使用變量的HTML實體了。

+1

mysql_real_escape_string不會使數據「安全」 –

+0

@YourCommonSense我只是重複使用OP的措辭,我爲混淆道歉。 – Tibor

+0

您不應該使用 mysql_real_escape_string以及 –

4

你也可以轉換的變量爲整數,因爲您的ID將只包含數字:

$id = (int)$_GET['id']; 

如果你傳遞一個字符串「?ID = asdoi」的$ id將獲得價值0.1