我有两个域名(在两个托管位置)。 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);
}
}
?>
问题:
如何确保用户在上传文件之前在
Domain 1
中通过身份验证?我的意思是我可以只更改Access-Control-Allow-Origin
但有人可以轻松转到 Chrome Developer 并从自定义 javascript 执行 POST 上传。有没有一种方法可以在不过于复杂的情况下完成
#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/