2016-05-17 106 views
0

我一直在這裏已經有很長一段時間了,我幾乎沒有使用PHP的經驗,並且我只從JavaScript開始。使用JS在服務器上運行PHP腳本

我試圖從網頁上的JavaScript使用AJAX運行我的服務器上的PHP腳本。說實話,我對自己在做什麼沒有太多的想法。

我當前的代碼:

JS:

function Write() { 
    $.ajax({ 
     type: "POST", 
     url: "Write.php", 
     data: { 
      'GUID': "12345678987654321", 
      'IP': "127.0.0.2", 
      'USERNAME': "George", 
      'BAN_REASON': "Broke my pencil." 
     }, 
     success: function(data) { 
      console.log(data); 
     } 
    }); 
} 

PHP:

<?php 
exec("java -jar Database.jar '.$_POST['GUID']' '.$_POST['IP']' '.$_POST['USERNAME']' '.$_POST['BAN_REASON']'"); 
?> 

(我也不太完全相信,我這樣做正確的字符串,等等,幫助將不勝感激)

基本上,該PHP代碼是使用我寫的一個Java程序寫MySQL數據庫使用由PHP「exec()」發送的參數。它根本不寫入數據庫,所以我認爲它是AJAX轉到PHP函數的東西。

當「寫()」的跑了,它是所有打印出來的PHP代碼到控制檯...

新規範

<?php 

//Server 
$servername = "localhost"; 
$dbusername = $_POST['DB_USERNAME']; 
$password = $_POST['DB_PASSWORD']; 
$dbname = "bansdb"; 

$username = $_POST['USERNAME']; 
$guid = $_POST['GUID']; 
$ip = $_POST['IP']; 
$ban_reason = $_POST['BAN_REASON']; 

$connection = new mysqli($servername, $dbusername, $password, $dbname); 

if ($connection->connect_error) { 
    die("Connection Failed: " . $connection->connect_error); 
} 

$sql = "INSERT INTO bans (GUID, IP, USERNAME, BAN_REASON) 
VALUES ('$guid', '$ip', '$username', '$ban_reason')"; 

if (mysqli_query($connection, $sql)) { 
    echo "Ban successfully added."; 
} else { 
    echo "Error: " . $sql . mysqli_error($connection); 
} 

mysqli_close($connection); 

?> 
+1

你用雙引號封裝,而不是單個。這種方法也存在巨大的安全缺陷。例如這個''。$ _ POST ['GUID']''不是連接的。爲什麼不使用PHP的'mysqli'或'PDO'寫數據庫? – chris85

+0

是的,我想要設置它的方式是用戶必須在網頁上提供一個密碼,然後傳遞給「Database.jar」。所以如果密碼不正確,它將無法對MySQL做任何事情。 如果還有其他缺陷,請告訴我。我對這一切都很陌生,所以我的方法可能會出現明顯的問題。 – Daedalus

+2

爲什麼不用PHP做這一切?同時將用戶數據直接傳遞給命令行可以打開各種注入。 – chris85

回答

1

我不會將您的數據庫用戶/密碼通過 網絡。只需製作一個簡單的應用程序密碼並使用db用戶名/密碼(在HTML修改表單中輸入APP_PASSWORD)靜態地將密碼存儲在PHP中。除了關閉SQL注入之外的參數化查詢,您還可以在您的值中使用單引號,並且不必擔心查詢中斷(驅動程序處理引用)。

<?php 
//Server 
$servername = "localhost"; 
$dbusername = 'static_db_user';//$_POST['DB_USERNAME']; 
$password = 'staticpassword';//$_POST['DB_PASSWORD']; 
$dbname = "bansdb"; 
if($_POST['APP_PASSWORD'] != 'Some generic password') { 
    die('Invalid Credentials'); 
} 
$username = $_POST['USERNAME']; 
$guid = $_POST['GUID']; 
$ip = $_POST['IP']; // I would store IP as an unsigned int, ip2long 
$ban_reason = $_POST['BAN_REASON']; 

$connection = new mysqli($servername, $dbusername, $password, $dbname); 

if ($connection->connect_error) { 
    die("Connection Failed: " . $connection->connect_error); 
} 

$sql = "INSERT INTO bans (GUID, IP, USERNAME, BAN_REASON) 
VALUES (?,?,?,?)"; 
if ($stmt = mysqli_prepare($connection, $sql)) { 
    mysqli_stmt_bind_param($stmt, , 'ssss', $guid, $ip, $username, $ban_reason; 
    if(mysqli_stmt_execute($stmt)) { 
     echo "Ban successfully added."; 
    } else { 
     echo "Execute Error: " . $sql . mysqli_error($connection); 
    } 
} else { 
    echo "Prepare Error: " . $sql . mysqli_error($connection); 
} 
mysqli_close($connection); 

?> 
+0

我對這一切還是很陌生的,但是有人可能不只是一起來下載PHP文件,然後獲得存儲在其中的密碼? – Daedalus

+1

不,PHP根據您的服務器配置文件(應由PHP進程處理)。您可以將密碼移動到非Web可訪問的目錄,然後使用PHP的include文件包含該文件。如果這種情況發生,即使PHP數據被暴露(這應該是非常罕見的開始),該文件將不會有密碼。 – chris85

+0

所有的工作都很好,除了一個錯誤,但項目已被廢棄。耗時15小時。 噢,至少我獲得了一些JS和PHP的經驗!很有趣,謝謝你的幫助,克里斯。 – Daedalus

0

它是所有打印出來的PHP代碼到控制檯...

您是否有配置爲執行PHP代碼的Web服務器?你必須認識到,你不能在你的「服務器」上的文件系統打開的瀏覽器中運行一個普通的php文件。

創建一個名爲info.php的新文件並將其保存到您的Web服務器。它只應該是這樣的:

<?php 
phpinfo(); 

如果您在瀏覽時看到該代碼,則說明您沒有啓用PHP。否則,你會看到很多關於你的配置的信息。


不太完全相信,我這樣做字符串正確

相當接近,但你應該read up的一些quotes

這可能會爲你工作:

<?php 
exec("java -jar Database.jar $_POST[GUID] $_POST[IP] $_POST[USERNAME] $_POST[BAN_REASON]"); 
+1

您應該使用該方法添加有關殼注射劑的註釋。 – chris85

+0

@ chris85在行動!我贊成你對這個問題的評論,以及幾乎所有其他問題。在這方面還有很多可以說的,但我想挑選一個可以消化的開始,指出所提出的具體問題。 –

相關問題