2011-09-25 40 views
-3

這個腳本安全嗎從sql注入?或者是否有可能更有效地改進它? 因爲我打算在公共場合使用它並且不知道這條線 「mysql_real_escape_string($ _ GET ['user_id']);」也許有可能改進它。這個腳本安全嗎從sql注入?

<? 
    $id = mysql_real_escape_string($_GET['id']); 

    if ($id == 1) 
     { 
     $userinfo['user_id'] = mysql_real_escape_string($_GET['user_id']); 
     $info = $db->fetchArray("SELECT points FROM ". PREFIX ."list WHERE user_id = '{$userinfo['user_id']}'"); 

     if (!empty($info)) 
     { 
      $user_rank = UserRank($userinfo['user_id']); 

      header('Content-type: image/png'); 
      $points = $info['server_points']; 
      $line = "empty"; 
      $nr = "Number"; 
      $font = 3; 
      $font2 = 2; 
      $width = ImageFontWidth($font)* strlen($nr) ; 
      $width2 = ImageFontWidth($font)* strlen($points); 
      $height = ImageFontHeight($font); 

      $im = ImageCreateFrompng(SYS_USER .'/banner.png'); 
      $points_text_color = imagecolorallocate($im, 225, 100, 112); 
      $nr_text_color = imagecolorallocate ($im, 217, 153, 101); 
      $line_color = imagecolorallocate ($im, 100, 123, 134); 
      imagestring ($im, $font, 40, 18, $points, $points_text_color); 
      imagestring ($im, $font2, 40, 11, $line, $line_color); 
      imagestring ($im, $font2, 40, 4, $nr, $nr_text_color); 
      imagestring ($im, $font, 60, 4, $user_rank, $nr_text_color); 

      imagepng($im); 
     } 
    } 
+1

什麼是PREFIX?它從何而來? –

+2

那麼,如果你使用is_numeric(),你可以肯定只有數字纔會通過 –

+0

屬於http://codereview.stackexchange.com/ – Quentin

回答

2

$id使用功能is_numeric()

if(is_numeric($id)) { // if id not numeric -> false else -> true 
    ... 
} 
1

與SQL變量進行交互時,我會認真考慮使用bind_param。你的代碼是來自許多不同地方的字符串的一個很好的例子,它可能已經被危害了。 bind_param強制在你傳入的字符串中沒有注入攻擊。如果有的話,它至少會給你足夠的安心,不用擔心這個問題。

例子:


$name = "Robert ') DROP TABLE Students;"; //see: http://xkcd.com/327/ 
$conn = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or 
    die('There was a problem connecting to the database.'); 
$query = "SELECT id FROM Users WHERE name=?"; 
if ($stmt = $conn->prepare($query)) { 
    $stmt->bind_param('s', $name); 
    $stmt->execute(); 
    $stmt->bind_result($result); 
    while ($stmt->fetch()) { 
     echo $result; 
    } 
    $stmt->close(); 
}