2016-05-15 62 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