Я загружаю файлы на свой сервер с классом Java в моем приложении для Android.
Я использую простой PHP скрипт для проверки пароля.
Если я введу неправильный пароль, файл не будет сохранен на сервере, и я должен получить 403, но я получу ОК 200 с сервера.
Вот класс Java
class httpUploadFile {
private int serverResponseCode = 0;
int uploadFile(String upLoadServerUri, String uploadFilePath, String uploadFileName,String pfad) {
String sourceFileUri=uploadFilePath + "" + uploadFileName;
HttpURLConnection conn;
DataOutputStream dos;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int maxBufferSize = 1024 * 1024;
File sourceFile = new File(sourceFileUri);
if (!sourceFile.isFile()) {
Log.e("uploadFile", "Source File not exist :"+uploadFilePath + "" + uploadFileName);
return 0;
}
try {
FileInputStream fileInputStream = new FileInputStream(sourceFile);
String fulluri=getUrl(upLoadServerUri,pfad);
URL url = new URL(fulluri);
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true); // Allow Inputs
conn.setDoOutput(true); // Allow Outputs
conn.setUseCaches(false); // Don't use a Cached Copy
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("ENCTYPE", "multipart/form-data");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
conn.setRequestProperty("uploaded_file", sourceFileUri);
dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\""+ sourceFileUri + "\"" + lineEnd);
dos.writeBytes(lineEnd);
// create a buffer of maximum size
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// read file and write it into form...
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
dos.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
// send multipart form data necesssary after file data...
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
// Responses from the server (code and message)
serverResponseCode = conn.getResponseCode();
String serverResponseMessage = conn.getResponseMessage();
Log.i("uploadFile", "HTTP Response is : "+ serverResponseMessage + ": " + serverResponseCode);
fileInputStream.close();
dos.flush();
dos.close();
} catch (MalformedURLException ex) {
ex.printStackTrace();
Log.e("Upload file to server", "error: " + ex.getMessage(), ex);
} catch (Exception e) {
e.printStackTrace();
Log.e("Upload file Exception", "Exception : "+ e.getMessage(), e);
}
return serverResponseCode;
}
private String getUrl(String BASE_URL,String pfad) {
String token = getToken();
String key = getKey(token);
return String.format("%s?token=%s&key=%s&pfad=%s&", BASE_URL, token, key,pfad);
}
private String getKey(String token) {
return md5(String.format("%s+%s", "wrongpassword", token));
}
private String getToken() {
return md5(UUID.randomUUID().toString());
}
private static String md5(String s) {
MessageDigest m = null;
try {
m = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
assert m != null;
m.update(s.getBytes(), 0, s.length());
return new BigInteger(1, m.digest()).toString(16);
}
}
а вот и PHP
<?php
$shared_secret = "password";
$key = $_GET['key'];
$token = $_GET['token'];
$pfad = $_GET['pfad'];
if ($key != hash("md5", "{$shared_secret}+{$token}")) {
header('HTTP/1.0 403 Forbidden');
die('403 Forbidden: You are not allowed to access this file.');
}
$file_path = "/home/www/data/".$pfad."/";
$file_path = $file_path . basename( $_FILES['uploaded_file']['name']);
if(move_uploaded_file($_FILES['uploaded_file']['tmp_name'], $file_path)) {
echo "success";
} else {
echo "fail";
}
?>
HTTP 200
означает, что передача выполняется на уровне HTTP, то есть запрос был технически в порядке и сервер смог правильно ответить.
200
не судит ли ваш бизнес логика имеет значение true или false, поэтому даже пароль неверен, только если связь http между сервером и клиентом нормальная, 200 будет возвращен.
Обычно мы отвечаем с HTTP 5xx если на сервере произошли технические или неисправимые проблемы. Или HTTP 4xx если во входящем запросе были проблемы (например, неправильные параметры)
Ваш бэкэнд сервер должен делать выше судьи.
Других решений пока нет …