javascript - php认证跨站文件上传

标签 javascript php html angularjs file-upload

我有两个域名(在两个托管位置)。 Domain 1 是一个带身份验证的普通网站。我正在使用 Domain 2 作为上传文件(用于存储)的地方。我正在使用 angular-file-upload https://github.com/danialfarid/angular-file-upload从客户端。

我的后端代码非常简单,目前可以正常工作..但没有任何形式的身份验证。

<?php
header('Access-Control-Allow-Origin: *');
$fname = $_POST["fname"];
if(isset($_FILES['file'])){
  //The error validation could be done on the javascript client side.

  $errors= array();        
  $file_name = $_FILES['file']['name'];
  $file_size =$_FILES['file']['size'];
  $file_tmp =$_FILES['file']['tmp_name'];
  $file_type=$_FILES['file']['type'];   
  $file_ext = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));
  $extensions = array("jpeg","jpg","png", "gif");        

  if(in_array($file_ext,$extensions ) === false){
   $errors[]="image extension not allowed, please choose a JPEG or PNG file.";
  }
  if($file_size > 2097152){
  $errors[]='File size cannot exceed 2 MB';
  }     

  if(empty($errors)==true){

    move_uploaded_file($file_tmp,"images/".$file_name);
    echo $fname . " uploaded file: " . "images/" . $file_name;
  }else{
    print_r($errors);
  }
}
?>

问题:

  1. 如何确保用户在上传文件之前在 Domain 1 中通过身份验证?我的意思是我可以只更改 Access-Control-Allow-Origin 但有人可以轻松转到 Chrome Developer 并从自定义 javascript 执行 POST 上传。

  2. 有没有一种方法可以在不过于复杂的情况下完成#1?是否可以传递一些 cookie 值?

我可以完全控制这两个托管站点,所以我可以为所欲为。

最佳答案

分享一个共同的 secret

一种方法是共享一个 secret ,只有站点A站点B知道。

假设站点 A 和站点 B 知道一个常见的复杂且不可预测的字符串 salt [randomness source] .

如果站点 A 对用户进行身份验证,A 会创建一个随机字符串 rndA,一个 valueThrough 时间戳,然后像这样计算哈希值:

   sharedHash = hash( rndA + salt + valueThrough )
  • 站点 A 将此元组移交给客户端:[ sharedHash, valueThrough , randA ]
  • 客户将这个元组交给站点 B
  • 站点 B 然后使用相同的 hash() 操作验证客户的权利

如果 B 计算相同的 sharedHash 并且当前的时间戳仍然小于 valueThrough,则客户端通过身份验证。

让站点 A 和站点 B 相互对话

或者,站点 A 和站点 B 可能直接相互对话:

  • 站点 A 将安全 token 移交给客户
  • 客户将安全 token 移交给站点 B
  • 站点 B 然后通过直接与站点 A 对话来验证 token

虽然此技术需要站点 A <-> 站点 B 的可达性,但如果站点 A 和站点 B 不能直接交换 HTTP 请求,前一种技术甚至可以工作。

在这两种情况下 Generating cryptographically secure tokens可能会感兴趣。

肯定存在其他更强大的技术。

关于javascript - php认证跨站文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21806093/

相关文章:

php - 仅在 IE 8 中重叠元素

javascript - 如何发出 AJAX 请求来获取单词并全局存储变量

javascript - ReferenceError 因为变量没有被传递

javascript - 如何使用 JavaScript 交换表格中的图像位置?

javascript - 重复自处理表格

php - 如何使 NetBeans IDE 9 与 PHP 一起使用?

html - 如何使 html 元素不可选择,除了文本区域和输入?

javascript - 将新行动态添加到具有从 csv 文件创建的标题的数组中

php - 使用 AJAX 和 PHP 添加到 MySQL

javascript - MeteorJS 如何将按钮放入与 #each 内的内容相对应的 {{#each}} block 中?