2014-02-15 59 views
2

對於網站漏洞類,我們一直負責設計一個有意利用mysql數據庫的php登錄。雖然我有一些基本的編程知識,並且我有一個「功能」登錄頁面,但我不確定如何使它不安全?也就是說,我輸入的任何SQL注入類型查詢似乎都不被接受,並且當我運行諸如「SQL注入我」之類的附加組件時,它也找不到任何問題。我理解如何清理用戶輸入,查詢服務器等的概念......但是我並沒有非常困難的時間讓它變得「可破解」。相信我,花費了數小時的時間,嘗試了不同的東西而無濟於事。我想我在概念上很難理解這一點,所以我可能沒有朝着正確的方向前進。故意不安全的php登錄 - 不明確的方向

如果有人願意指引我正確的方向,或給我一些指針,我將不勝感激。

這些是基本的SQL注入攻擊,我試圖讓它容易受到攻擊。

<?php 
session_start(); 
// store session data 
$_SESSION['views']=1; 
?> 

    <?php 
    //retrieve session data 
    // echo "Pageviews=". $_SESSION['views']; 
    ?> 

<?php 
// Create connection 
$con=mysqli_connect("localhost","root","","logins"); 
if (mysqli_connect_errno()) 
    { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 
    $i=0; 
    $userName = $_POST['username']; 
    $userPass = $_POST['password']; 

$result = mysqli_query($con,"SELECT * FROM users"); 

while($row = mysqli_fetch_array($result)){ 
    if($_POST['username'] == $row['Username']) 
    { 
    $i++;} 
    if($_POST['password'] == $row['Password']) 
    { 
    $i++;} 
    } 

if($i>1){ 
echo "Winner"; 
} 
else{ 
echo "Loser";} 
//echo $row['Username'] . " " . $row['Password']; 
//echo "<br>"; 


    //echo "<br>"; 
    //echo $_POST['username']; 
    //echo "<br>"; 
    //echo $_POST['password']; 
// echo "<br>"; 


?> 

另一種方法我Dabling用:

<?php 
session_start(); 
// store session data 
$_SESSION['views']=1; 
?> 

    <?php 
    //retrieve session data 
    // echo "Pageviews=". $_SESSION['views']; 
    ?> 

<?php 
// Create connection 
$con=mysqli_connect("localhost","root","","logins"); 
if (mysqli_connect_errno()) 
    { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 

$verify = mysqli_query($con,"SELECT * FROM users"); 

while($row = mysqli_fetch_array($verify)) 
    { 
    if (($_POST["username"] == $row['Username']) and ($_POST["password"] == $row['Password'])) 
     { 
     echo "Winner " .$row['Firstname']." " .$row['Lastname']; 
     } 

     else 
     { 
     echo "Failure"; 
     } 
    } 

mysqli_close($con); 
?> 
+2

您的代碼不容易受到SQL注入攻擊,因爲您沒有任何輸入到您的查詢。你的查詢是靜態的'SELECT * FROM users'。爲了使它們易受攻擊,你需要像''SELECT * FROM users'那樣的未經過濾的輸入。'WHERE username ='{$ _ POST ['username']}'「' –

+0

你應該在你的查詢中直接向db輸入輸入以使它不安全,如果條件使用它們。檢查這有用的答案在這裏http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php?rq=1 – Fabio

+0

哇,如此快速的迴應!我會給這些旋轉!謝謝! – Chip567

回答

2

對於一段代碼是開放的,以SQL注入你只需要採取用戶輸入(典型地從一種形式)並將其傳遞給該數據庫沒有轉義它。

由於輸入未被轉義,用戶可以跳出預期的查詢。

的這個PHP中的最基本的例子/ MySQL是如下:

$mysqli->query("SELECT * FROM some_table WHERE some_column = '{$_POST['some_field']}'"); 

在你的榜樣,將路過張貼的用戶名/密碼數據庫查詢沒有逃脫它。

爲了防止SQL注入mysqli您可以使用real_escape_stringprepared statements

對於登錄系統,通常最好的做法是查詢數據庫並查看是否找到了匹配項,而不是遍歷每個存儲的用戶名和密碼以查看是否匹配。想象一下,如果有一百萬個用戶帳戶。這樣,您也不需要從數據庫傳輸用戶名/密碼,因爲您只需SELECT 1並查看返回的行數。這使得代碼更乾淨,更快速,更安全。