2017-02-20 62 views
0

好吧我有兩種不同的風格與我的服務器端PHP進行通信,我想知道是否有任何缺點都基於您的專家意見。在客戶端/服務器通信中使用這兩種不同樣式有沒有優點和缺點?

首先是從我客戶端HTML發送到我的服務器端PHP

function myCall(){ 
var name1 = "myName"; 
var name2 = "myOtherName"; 
var myString = "SELECT * FROM myTable WHERE id IS NOT NULL AND name='"+ name1 +"' AND secondName='"+name2+"'"; 
var xmlhttp = new XMLHttpRequest(); 

xmlhttp.onreadystatechange = function() { 
    if (this.readyState == 4 && this.status == 200) { 
     recievedData = JSON.parse(this.responseText); 
     recievedData.forEach(function(item){ 
     document.getElementById("demo").innerHTML += recievedData.name; 
     }); 
    } 

}; 

xmlhttp.open("GET", "myphp.php?q="+myString,true); 
xmlhttp.send(); 
} 

一個完整的字符串,然後由服務器端PHP

$q = $_REQUEST['q']; 

$servername = "localhost"; 
$username = "root"; 
$password = ""; 
$dbname = "myDB"; 

// Create connection 
$conn = new mysqli($servername, $username, $password, $dbname); 
// Check connection 
if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

$sql = $q; 
$result = mysqli_query($conn, $sql) or die("Error in Selecting " . mysqli_error($conn)); 
$outp = array(); 

while($row=mysqli_fetch_assoc($result)) 
{ 
    $outp[] = $row; 
} 


echo json_encode($outp); 
?> 
收到

然後還有另一種方法。 --------------------------------------

function myCall(){ 
var name1 = "myName"; 
var name2 = "myOtherName"; 

var myString = name1 + " " + name2; 
var xmlhttp = new XMLHttpRequest(); 

xmlhttp.onreadystatechange = function() { 
    if (this.readyState == 4 && this.status == 200) { 
     recievedData = JSON.parse(this.responseText); 
     recievedData.forEach(function(item){ 
     document.getElementById("demo").innerHTML += recievedData.name; 
     }); 
    } 

}; 

xmlhttp.open("GET", "myphp.php?q="+myString,true); 
xmlhttp.send(); 
} 

而且收到這個PHP,但它使用explode()把它變成一個PHP可以理解的數組。

$q = $_REQUEST['q']; 
$exp = explode(" ", $q); 

$servername = "localhost"; 
$username = "root"; 
$password = ""; 
$dbname = "myDB"; 

// Create connection 
$conn = new mysqli($servername, $username, $password, $dbname); 
// Check connection 
if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

$sql = "SELECT * FROM myTable WHERE id IS NOT NULL AND name='"+ exp[0] +"' AND secondName='"+ exp[1] +"'"; 
$result = mysqli_query($conn, $sql) or die("Error in Selecting " . mysqli_error($conn)); 
$outp = array(); 

while($row=mysqli_fetch_assoc($result)) 
{ 
    $outp[] = $row; 
} 


echo json_encode($outp); 
?> 

兩個歸還相同的結果,但不同的方法完全是這樣的......根據你的專家意見,有什麼可以去錯了這兩種不同的風格?

+0

IMO,你不應該在你的HTML/JS代碼中寫一個SQL請求,因爲它會出現在頁面的源代碼中。因此第二種解決方案似乎更好。 – roberto06

+3

你已經給自己開放了sql注入攻擊 – Pete

回答

1

第一種方法存在嚴重的安全漏洞。

  1. 它公開了數據庫的結構。
  2. 它直接從客戶端側弦

這使得你的數據庫容易受到SQL注入式攻擊節選的SQL語句。

+0

,但是如果你僅限於一個php,並且通過cleavable和cleavable的組合使用你可以完全安全的話,第一種方法可以被擴展由php – Arkonsol

+1

@Arkonsol no收到的數據..你永遠不會相信任何來自客戶端的信息。永遠不要以爲你比另一端的壞人更聰明。盡你所能來保護您的數據庫。這包括從不公開暴露與數據庫結構有關的任何事情。我需要做的就是查看源代碼中的HTML以獲取該信息。然後,使用內置的瀏覽器工具來更改SQL以刪除表格,截斷數據等是很簡單的。 –

+0

哦,好吧,謝謝,夥計們 – Arkonsol

1

方法1是像門框的房子,但沒有門。兩種方法都允許人們進入你的房子,但選項1正在讓任何人進入你的房子,無論你有沒有知道。當你讓他們去之前,方法2將檢查的人員(參數)。

如果你不介意任何人知道周圍的那些鏈接亂用你的數據庫,確保您可以使用方法1

你應該知道這就是所謂的SQL injection

相關問題