2013-05-20 40 views
-1

我的登錄表單有問題SQL注入正在處理它,所以如何阻止它。如何從sql注入保存我的登錄表單

我使用mysql_real_escape_string,但什麼都沒有改變

if(isset($_POST['submit-login'])) { 

    $user = $_POST['username']; 
    $pass = $_POST['password']; 

    $username = mysql_real_escape_string($user); 
    $password = mysql_real_escape_string($pass); 

    $usertool = new Usertool(); 
    if($usertool->login($username, $password)){ 
     //successful login, redirect them to a page 
     header("Location: index.php"); 
    }else{ 
     $error = "Incorrect username or password. Please try again."; 
    } 
} 

這裏是usertool

class usertool { 
    public function login($username, $password) { 
     $hashedPassword = md5($password); 
     $result = mysql_query("SELECT * FROM tbl_user WHERE uname = '$username' OR eemail = '$username' AND password = '$hashedPassword'"); 
     if (mysql_num_rows($result) == 1) { 
      $_SESSION["user"] = serialize(new User(mysql_fetch_assoc($result))); 
      $_SESSION["login_time"] = time(); 
      $_SESSION["logged_in"] = 1;  
      return true; 
     } else { 
      return false; 
     } 
} 
+2

按照這個http://stackoverflow.com/questions/60174/how-to-prevent-sql-injection-in-php?rq=1 – Rahul11

+1

@ØHankyPankyØ這是不正確的。無論是奉獻還是避免mysql ext都可以影響sql注入漏洞 –

+0

@YourCommonSense採取的建議和刪除的註釋 –

回答

4

它不是一個典型的SQL注入你的情況,而是錯誤的SQL邏輯。

您需要括號添加到您的查詢:

SELECT * FROM tbl_user 
    WHERE (uname = '$username' OR eemail = '$username') 
     AND password = '$hashedPassword'" 

在原來的查詢,如果輸入的用戶名或電子郵件匹配整個語句評估爲真,且密碼甚至沒有被檢查

和關於SQL爲了使您的查詢安全起見,您必須根據這些規則格式化查詢部分

  1. 格式必須是c完成。 mysql_real_escape_string單獨完成不完整的格式化:您應該在使用此函數轉義的任何數據周圍添加撇號。
  2. 格式必須足夠,意味着您不能使用字符串格式設置數字或標識符的格式。所有的SQL文本都要求它有自己獨特的格式。
  3. 格式化必須儘可能接近查詢執行。

遵循這些規則,您將非常安全的注射。使用準備好的語句是遵循它們的最簡單方法。

一個既不需要mysqli也不需要PDO來使用本地準備的語句 - 您可以創建自己的變體。但是,儘管如此,您必須儘可能地將mysql_real_escape_string移到更接近查詢執行的位置,並始終在結果周圍添加撇號。

+0

解決上述代碼的任何幫助? – deerox

+0

是的,我注意到了,現在:)非常感謝。現在sql注入不起作用。但我很擅長測試它。黑客很聰明,然後我們哈哈再次感謝你讓我知道,如果你看到在這裏的任何其他錯誤:) – deerox

+0

@deerox,它不是「代碼」,它是「代碼」。 –

相關問題