2017-06-19 46 views
0

我將如何製作此PHP腳本SQL注入證明?

<?php 
 
    
 
$conn = mysql_connect("localhost", "root", "") or die ('Error connecting to MySQL!'); 
 
mysql_select_db("aspire"); 
 
    
 
$earnedpoints = false; 
 
$account = $_POST['name']; 
 
$account = mysql_real_escape_string($account); 
 
    
 
if ($account == "") { 
 
    echo 'Enter an account name!'; 
 
    exit(); 
 
} 
 
    
 
$ip = $_SERVER['REMOTE_ADDR']; 
 
$time = time(); 
 
    
 
$query = mysql_query("SELECT *, SUM(`times`) as amount FROM votingrecords WHERE account='$account' OR ip='$ip'"); 
 
$lasttime = mysql_fetch_array($query); 
 
$amount = $lasttime['amount']; 
 
$insertnew = false;  
 
if ($amount == "") { 
 
    $insertnew = true; 
 
} 
 
$timecalc = $time - $lasttime['date']; 
 
if (!$insertnew) { 
 
    if ($timecalc < 21600) { 
 
     echo ' Hello '. $account .' you have already voted with this account ('. $account .') or IP ('. $ip .') in the last 6 hours!'; 
 
     echo ' Last voted on: '. date('M d\, h:i:s A', $lasttime['date']) .''; 
 
     echo '<html>'; 
 
     echo '<head>'; 
 
     echo '<meta HTTP-EQUIV="REFRESH" content="10; url=/">'; 
 
     echo '</head>'; 
 
     echo '<body>'; 
 
     echo '<br><br>You will be redirected to the main website in 10 seconds.'; 
 
     echo '</body>'; 
 
     echo '</html>'; 
 
     exit(); 
 
    } else {     
 
     $update = mysql_query("UPDATE votingrecords SET account='$account', date='$time', times=times+1 WHERE ip='$ip'"); 
 
      if (!$update) { 
 
       $message = 'Invalid query: ' . mysql_error() . "\n"; 
 
       $message .= 'Whole query: ' . $update; 
 
       die($message); 
 
      } else { 
 
       $earnedpoints = true; 
 
      } 
 
     } 
 
} else { 
 
    $success = mysql_query("INSERT INTO votingrecords (`account`, `ip`, `date`, `times`) VALUES ('$account', '$ip', '$time', 1)"); 
 
    if (!$success) { 
 
      $message = 'Invalid query: ' . mysql_error() . "\n"; 
 
      $message .= 'Whole query: ' . $success; 
 
      die($message); 
 
    } else { 
 
     $earnedpoints = true; 
 
    } 
 
} 
 
    
 
    
 
    
 
    
 
if ($earnedpoints) { 
 
    $points = mysql_query("UPDATE accounts SET votepoints = votepoints + 2 WHERE name='$account'");     
 
    if (!$points) { 
 
    
 
      $message = 'Invalid query: ' . mysql_error() . "\n"; 
 
      $message .= 'Whole query: ' . $query; 
 
      die($message); 
 
    } 
 
    mysql_close($conn); 
 
    echo '<html>'; 
 
    echo '<head>'; 
 
    echo '<meta HTTP-EQUIV="REFRESH" content="0; url=http://www.gtop100.com/in.php?site=80994">'; 
 
    echo '</head>'; 
 
    echo '</html>'; 
 
} else { 
 
    echo 'There was an error processing your request.'; 
 
    exit(); 
 
} 
 
?>

嘿大家,

我非常缺乏經驗與PHP腳本,我已經告訴我的腳本是容易受到SQL注入?但是我不知道如何讓它成爲SQL注入證明,因爲我在該領域沒有多少經驗,並且恐怕我可能會弄亂代碼。

任何人都可以幫助我嗎?我將不勝感激。

+0

使用準備好的聲明。 –

+0

我不知道我明白。 –

回答

0

How can I prevent SQL injection in PHP?

你的代碼確實是逃跑的輸入值,但的mysql_connect在PHP 5.5棄用,在PHP 7完全刪除。 使用參數化查詢是最好的選擇:

您需要首先打開連接,而不是

$conn = mysql_connect("localhost", "root", "") or die ('Error connecting to MySQL!'); mysql_select_db("aspire");

您將打開這樣

$mysqli = new mysqli("localhost", "root", "", "aspire");

連接然後準備的,而不是把這樣的查詢

$query = mysql_query("SELECT *, SUM(`times`) as amount FROM votingrecords WHERE account='$account' OR ip='$ip'"); 

您的查詢,你就會把它像這樣

$stmt = $mysqli->prepare("SELECT *, SUM(`times`) as amount FROM votingrecords WHERE account='?' OR ip='?'"); 

這是一個準備好的聲明,它不是你會把你的查詢輸入,它是PHP會爲你做的,你需要做的就是綁定你的查詢輸入$stmt像這樣

$stmt->bind_param("s", $account); 
$stmt->bind_param("s", $ip); 

您具有的兩個輸入$account$ip,賬號和IP都是字符串,它恰好是S代表......你現在將執行該語句,這樣

$stmt->execute(); 

並且不要忘記關閉連接T優開

$stmt->close(); 
+0

嘿,我感謝您的幫助,我不知道如果我正確地做到了,但我把我的代碼引擎收錄,因爲我不能在這裏貼。 https://pastebin.com/NbcXGG92 –

+0

所以,一切的代碼是除了17行是否正確?你是指$ ip我應該將它改爲「?」的地方嗎? –

+0

我真的不能排除你的代碼的權利,但一旦你可以自己做所有這些,你只需要結構化的學習包有整個怎樣的作品,請您按照這個簡單的教程,一切都將變得清晰全面的瞭解水[鏈接](https://www.w3schools.com/php/php_ref_mysqli.asp) –