使用JavaScript安全地发布消息


Posting messages securely with JavaScript

我正在制作一个聊天应用程序,我正在使用一个.htaccess文件来防止外部来源读取消息。但是,这也会阻止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.php文件发送POST请求以添加消息,但如果有.htaccess文件,JavaScript也不能发送POST请求。有人能解决这个问题吗?

您的问题是所有身份验证似乎都发生在客户端。您不能这样做,因为客户端可以修改任何内容。在您的情况下,任何人都可以伪造用户名cookie,或者只是自己制作请求。由于客户端可以完全控制他们发送的请求类型,因此不能只允许通过脚本进行访问。

如果您只希望特定的客户端能够使用用户名,则需要让客户端登录到您的应用程序中。可能最简单的方法是使用PHP会话。客户端现在登录,应用程序在会话变量中设置用户名,并自动将会话标识符发送回客户端。该会话标识符在每个后续请求中都会使用,您可以使用该标识符检索用户名。

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

除此之外,还要研究如何保护自己免受sql注入的影响。