2014-12-03 44 views
-2

我有一個名爲proxyCreate.php的php webservice,它將兩個值,用戶名和密碼傳遞給驗證用戶憑據的API。如何將標記中的用戶名變量傳遞給php代碼?

這工作正常。

但是,API返回僅返回認證的用戶名,密碼和認證日期。

我們還想抓取用戶的deptID,但不幸的是,API無法做到這一點,我們無法控制API返回的內容。

因此,我試圖查詢數據庫表以返回與經過身份驗證的用戶關聯的DeptID。

到目前爲止,我得到的是說,「一個無效參數傳遞給SQL_Srv查詢」

反正是有解決這個錯誤?

這是我到目前爲止。

<?php 
error_reporting(E_ERROR | E_WARNING | E_PARSE); 

session_start(); 

// Connect to SQL Server database 
include("../../connections/Connect.php"); 

$upass = $_GET['upass']; 
// Construct query 

$tsql = 
" 
SELECT 
    ISNULL([ORGANIZATION],'') 

FROM 
[EMPLOYEE] 
WHERE Lower([LOGINNAME]) = lower('$upass') 
"; 

$stmt = sqlsrv_query($conn, $tsql); 
if($stmt === false) 
{ 
    echo "Error in executing query.</br>"; 
    die(print_r(sqlsrv_errors(), true)); 
} 
$results = array(); 
// Retrieve and display the results of the query 
//$lastFeatType = ""; 
while($row = sqlsrv_fetch_array($stmt,SQLSRV_FETCH_ASSOC)) { 
    array_push($results,$row); 
} 

echo json_encode($results); 

// Free statement and connection resources 
sqlsrv_free_stmt($stmt); 
sqlsrv_close($conn); 
?> 

<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="utf-8"> 
</head> 
<body> 
    <h1> 
    FTS Service Requests 
</h1> 
    <div class="action-container" style="display:none;"></div> 


    <div id="tabs"> 
    <ul> 
<div id="dialog" title="Basic dialog"> 
    <p style="font-size:14pt;">User Log In</p> 
</div> 
    </ul> 
<p> 
</p> 
<br clear="all" /> 
<div> 
    <br /> <br /> 
     <br /> 
     <?php 
     //Start session 
     session_start(); 
     header("Cache-Control: no-store, must-revalidate, max-age=0"); 
     header("Pragma: no-cache"); 
     header("Expires: Thu, 19 Nov 1981 08:52:00 GMT"); 
     if(!empty($_GET['status'])){ 
       echo '<div align=center><font color=firebrick>You have been logged out!</font><br><br>Log in again or close browser.</div>'; 
     } 
     ?> 
     <br /> 
     <br /> 
     <br /> 
     <form id="FormToValidate"> 
     <table> 
     <tr> 

      <td nowrap> 
        <div class="input text"> 
       <label><strong>UserName:</strong></label> 
       <input maxlength="40" class="required" name="user" id="user" size="20" placeholder="Enter username!" type="text" title="Please enter a username." tabindex="2" value="" style="width:400px;color:#000;font-size:10pt;height:20px;" /> 
      </div> 
      </td> 
      </tr> 
      <tr> 
       <td nowrap> 
       <div class="input text"> 
       <label><strong>Password:</strong></label> 
       <input maxlength="40" class="required" name="pass" id="pass" size="20" placeholder="Enter password!" type="password" tabindex="3" title="Please enter a password." value="" style="width:400px;color:#000;font-size:10pt;height:20px;" /> 
       </div> 
       </td> 

     </tr> 

     <tr> 
      <td></td> 
       <td> 
       <div class="buttonSubmit"> 
       <input type="button" id="btnValidate" style="width:80px; margin-left:-152px;background-color:#fff;" value="Log In" /> 
      </div><br clear="all"/> 
     </td> 
     </tr> 
    </table> 

    </form> 
</div> 

<script type="text/javascript"> 

$("#btnValidate").click(function() { 

// Creating variables to hold data from textboxes 

var uname = $("#user").val(); 
var upass = $("#pass").val(); 

$.post("proxyCreate.php", 
    { data: JSON.stringify({ LoginName: uname,Password: upass }) }) 
    .done(function(data) { 
     var result = JSON.parse(data); 
     switch(result.Status) { 
      case 0: 
       //login successful 
       tokenVal = result.Value.Token; 
       location.href = "http://Accounts/accounts.php?token="+tokenVal+ "&user=" + uname; 
       break; 

      case 2: 
       //invalid login 
       alert(result.Message); 
       break; 
     } 
    }) 
    .fail(function() { 
     alert("The AJAX request failed!"); 
    }); 
    }); 
</body> 
</html> 
+0

等待...所以在這個系統中的密碼是:1)存儲在一個名爲'LOGINNAME'的字段中,2)存儲在*純文本*中,3)*不區分大小寫? *和*代碼是可注入SQL的。我懷疑得到'DeptID'是這裏最擔心的問題...... – David 2014-12-03 17:47:34

+0

@David,NO。顧名思義,這是登錄名或用戶名,而不是密碼。如前所述,它們被傳遞給一個API,你看不到它。一切都通過proxyCreate.php。我不知道你是如何得出你的結論的。 – 2014-12-03 17:57:43

+0

SQL查詢建議否則...'WHERE Lower([LOGINNAME])= lower('$ upass')' – David 2014-12-03 17:58:29

回答

-1
$tsql = 
"SELECT ISNULL([ORGANIZATION],'') FROM [EMPLOYEE] 
WHERE Lower([LOGINNAME]) = lower('".$upass."') 
"; 
+0

和David,我現在看到它。我很抱歉。我的意思是說$ uname,但仍然不會將它傳遞給API時顯示爲純文本。 我認爲這個問題與標記和php在同一頁上有關係嗎? 任何專家的想法將不勝感激。 – 2014-12-03 18:01:31

0

它看起來像成形後不被正確處理。請注意,這是一個POST方法...

$.post(... 

然而,在代碼中,你正在尋找一個GET值:

$upass = $_GET['upass']; 

這將導致$upass沒有價值。你想使用的$_POST陣列:

$upass = $_POST['upass']; 

此外,它看起來像頁面在一個地方檢查值:

if(!empty($_GET['status'])){ 

但在運行之前不檢查值實際的查詢。應該在該查詢周圍使用相同的if塊,以確保在嘗試從數據庫中查找DeptID之前已提供該值。

最後,它看起來像是混淆了服務器端和客戶端操作順序。這是由AJAX請求發佈的頁面嗎?答案不會是你期望的。你呼應JSON數據:

echo json_encode($results); 

但頁面的其餘部分仍然執行,所以所有的HTML標記將被以及返回。這可能會混淆JSON解析器客戶端。我建議將UI頁面從JSON服務分離爲兩個單獨的文件。