2011-11-18 28 views
2

我在這裏有這行代碼。登錄驗證到遠程mysql數據庫

我的Java代碼:

btnLogin.setOnClickListener(new View.OnClickListener() { 

    @Override 
     $public void onClick(View v) { 

     ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>(); 
     postParameters.add(new BasicNameValuePair("username", txtUsername.getText().toString())); 
     postParameters.add(new BasicNameValuePair("password", txtPassword.getText().toString())); 




    //String valid = "1"; 
    String response = null; 
    try { 
    response = CustomHttpClient.executeHttpPost("http://www.sampleweb.com/imba.php", postParameters); 
    String res=response.toString(); 
    // res = res.trim(); 
    res= res.replaceAll("\\s+",""); 
    //error.setText(res); 
    if(res.equals("1")){ 
    txtError.setText("Correct Username or Password"); 
    //Intent i = new Intent(CDroidMonitoringActivity.this, MenuClass.class); 
    //startActivity(i); 
    } 
    else { 
    txtError.setText("Sorry!! Incorrect Username or Password"); 
    } 
    } catch (Exception e) { 
    txtUsername.setText(e.toString()); 

    } 

} 
       }); 
      } 

我的PHP腳本代碼:

<?php 
    $un=$_POST['username']; 
    $pw=$_POST['password']; 

    $user = ‘bduser’; 
    $pswd = ‘dbpwd’; 
    $db = ‘phplogin’; 
    $conn = mysql_connect("localhost","root",""); 
    mysql_select_db($db, $conn); 

    $query = mysql_query("SELECT * FROM user WHERE username = '$un' AND password = '$pw'"); 
    $result = mysql_query($query) or die("Unable to verify user because : " . mysql_error()); 

     if(mysql_num_rows($result) == 1) 

    echo 1; // for correct login response 
    else 
    echo 0; // for incorrect login response 
     ?> 

我有這個代碼的問題。在我的android代碼中,當我嘗試將res.equals更改爲包含。它總是說正確的密碼,但如果我不改變它,它說不正確的密碼。我不知道我的java代碼或我的php代碼中有什麼問題。真的需要幫助。

回答

0

將您的PHP更改爲'select count(*)'並檢查結果的實際數值。這樣你就不會試圖比較一個可能拋出線數的可能的NULL值。

另外檢查您的PHP單獨以確保您從ECHO獲得正確的響應。

請注意,您的android代碼將阻塞,直到它得到結果。你可能應該在一個線程中重新編碼它。否則,如果SQL太慢,設備將拋出「無響應」並退出。

編輯:添加一些代碼 - 略有不同,因爲它檢查是否設置了特定值而不是返回任何內容。同樣的想法,還有幾行代碼。

/** Authenticate a login. 
* 
* @param string $Username 
* @param string $Password 
* @return int 
*/ 
function login($Username, $Password) 
{ 
    Logger::DEBUG("Login attempt by '" . $Username . "'"); 

    try 
    { 
     $conn = DBConnection::_getConsole2DB(); 

     $query = "select LoginId, UserId, RoleId, ProjectMask, RestrictionMask from Users where LoginId = ? and Password = ? and Active = 1"; 
     $st = $conn->prepare($query); 
     $st->bindParam(1, $Username); 
     $st->bindParam(2, $Password); 
     $st->execute(); 

     $row = $st->fetch(PDO::FETCH_ASSOC); 
        if(!isset($row[ 'UserId' ])) return 0; 

     $this->userId = $row[ 'UserId' ]; 
     $this->roleId = $row[ 'RoleId' ]; 
     $this->projectMask = $row[ 'ProjectMask' ]; 
     $this->restrictionMask = $row[ 'RestrictionMask' ];   

     $_SESSION[ 'userId' ] = $this->userId; 
     $_SESSION[ 'roleId' ] = $this->roleId; 
     $_SESSION[ 'projectMask' ] = $this->projectMask; 
     $_SESSION[ 'restrictionMask' ] = $this->restrictionMask; 
     $_SESSION[ 'loginId' ] = $row[ 'LoginId' ]; 

    } 
    catch(PDOException $e) 
    { 
     Logger::PDO_ERROR($e); 
     return -1; // error 
    } 

    return 1; 
} 

這使用PDO,因此與您嘗試的操作有一些小的語法差異。

+0

你能給我一個PHP示例代碼先生嗎? – ching

0

在你正在做mysql_query(mysql_query())的代碼中我相信。

首先嚐試:

txtError.setText(res); 

順便說一句:SQL注入。如果輸入密碼:

' UNION SELECT * FROM user WHERE username='admin 
+0

我試圖把res放在打開和關閉括號中。但它提供了一個來自mysql的錯誤。 – ching

1

它看起來像錯誤是在PHP代碼中。

更改以下行: -

來源:

$query = mysql_query("SELECT * FROM user WHERE username = '$un' AND password = '$pw'"); 

要:

$query = "SELECT * FROM user WHERE username = '$un' AND password = '$pw'"; 

你也應該考慮修改,以防止SQL注入: -

$query = sprintf("SELECT * FROM user WHERE username = 
    WHERE username='%s' AND password='%s'", 
    mysql_real_escape_string($un), 
    mysql_real_escape_string($pw)); 
+0

sir該SQL注入的目的是什麼? – ching

+1

鑑於您正在接收來自請求的數據,您應該對其進行清理,以避免接收以允許「壞人」登錄甚至訪問您的數據和數據庫結構的方式格式化的數據。注意SQL注入並閱讀一些內容。 – Alfabravo

+0

對不起。這是我第一次遇到Sql注入。即時通訊新的PHP。 – ching