2016-05-15 69 views
1

我在製作一個聊天應用程序,並使用.htaccess文件來阻止外部消息來源閱讀消息。但是,這也阻止了JavaScript發送消息。我的JavaScript是:使用JavaScript安全地發佈消息

$("#sendMsg").onclick(function(){ 
$.post('post.php', 
{ msg : $("#msgBox").val(), user : getCookie('username')}, 
function(result) {alert(result);}); 
}); 

我對post.php PHP是:

<?php 
$message = $_POST['msg']; 
$user = $_POST['user']; 
$servername = "localhost:3306"; 
$username = "user"; 
$password = "pass"; 
$dbname = "dbname"; 
$conn = mysqli_connect($servername, $username, $password, $dbname); 
$sql = "INSERT INTO tablename (username, message) VALUES ('" . $user . "', '" . $message . "'); SELECT * FROM tablename"; 
$result = mysqli_query($conn, $sql); 
$numofmessages = 0 
while($row = mysqli_fetch_assoc($result)) { 
    $numofmessages++; 
echo $numofmessages; 
?> 

編輯:.htaccess文件有:

order deny, allow 
<FilesMatch "post.php"> 
deny from all 
</FilesMatch> 

如果沒有.htaccess文件,任何人都可以發送POST請求到post.php文件以添加消息,但是如果有一個.htaccess文件,JavaScript也不能發送POST請求。有沒有人有這個好的解決方案?

+2

那麼,沒有你在'.htaccess'風格文件中發佈規則,我們就無能爲力...... – arkascha

+1

你如何驗證用戶?你爲什麼不呢? –

+3

不相關,但您的代碼易受sql注入影響。見[這裏](http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php)如何保護自己免受它。 – Sumurai8

回答

2

您的問題是,所有的身份驗證似乎都發生在客戶端。你不能這樣做,因爲客戶端可以修改任何東西。在你的情況下,任何人都可以欺騙用戶名cookie,或者直接製作請求本身。由於客戶端可以完全控制他們發送的請求類型,因此不能只允許通過腳本訪問。

如果您希望只有特定的客戶端能夠使用用戶名,您需要讓客戶端登錄到您的應用程序中。可能最簡單的方法是使用PHP會話。客戶端現在登錄後,應用程序會將用戶名設置爲會話變量,並自動將會話標識符發送回客戶端。此會話標識符在每個後續請求期間使用,您可以使用該標識符檢索用戶名。

session_start(); 
if(empty($_SESSION['username'])) { 
    header("Location: login.php"); 
} 

此外,請查看how you can protect yourself against sql injection

+0

謝謝你。我現在使用會話而不是cookie。但是,我仍然不確定如何使用JS安全地發送消息。 –

+0

你通過一個會話完成的事情是,變量'username'存儲在服務器上,並且僅用於該特定會話。用戶不能再指定任意用戶名。通過使用後請求而不是獲取請求,您可以保護自己免受使用重定向將惡意站點發布爲其他人的惡意站點的威脅。但是,您不能阻止人們在腳本之外發出對該URL的請求,因爲除了「遠程IP」(發出請求的IP)之外,http請求的每個部分都可能被欺騙。 – Sumurai8