2017-02-20 1 views
0

Хорошо, у меня есть два разных стиля общения с моим серверным PHP-сервером, и я хочу знать, есть ли какие-либо недостатки для обоих на основе ваших экспертных заключений.Есть ли какие-либо плюсы и минусы в использовании этих двух разных стилей в коммуникации Client/Server?

Прежде всего это полная строка, которая отправляется из моего стороны клиента 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, вы не должны писать запрос SQL в свой код HTML/JS, поскольку он будет отображаться в исходном коде страницы. Следовательно, второе решение кажется лучше. – roberto06

+3

Вы оставили себя в открытом доступе к атакам инъекций sql там – Pete

ответ

1

Первый способ имеет серьезный недостаток безопасности.

  1. Он раскрывает структуру вашей базы данных.
  2. Он excepts в SQL заявление непосредственно из клиентской части строки

Это делает вас базы данных уязвимы для атак с внедрением SQL.

+0

, но затем первый способ можно расширить, если вы ограничены только одним php и использованием кливера комбинацией 'explode' и' strpos' вы можете полностью защитить данные, полученные php – Arkonsol

+1

@Arkonsol no .., вы никогда не сможете доверять чему-либо, исходящему от клиента. Никогда не думай, что ты умнее, чем плохой парень на другом конце. Сделайте все возможное, чтобы защитить свою базу данных. Это включает НИКОГДА публично не раскрывает ничего, что связано со структурой вашей базы данных. Все, что мне нужно сделать, это просмотреть HTML-код в источнике, чтобы получить эту информацию. Тогда было бы тривиально использовать встроенные инструменты браузера для изменения SQL, чтобы отбрасывать таблицы, обрезать данные и т. Д. –

+0

oh okay thanks dude – Arkonsol

1

Способ 1 подобен дому с дверной рамой, но без двери. Оба метода позволяют людям войти в ваш дом, но вариант 1 - это то, что кто-либо заходит внутрь, с вами или без вашего ведома. Когда метод 2 будет проверять лицо (параметр), прежде чем позволить им войти.

Если вы не возражаете, что кто-нибудь знать эти ссылки возиться с базой данных, конечно вы можете использовать метод 1.

Вы должны знать который называется SQL injection

Смежные вопросы