kciray
@kciray
Студент

Как надёжно защитить файлы и выдавать их по ключу или паролю?

Я собираюсь продавать приложение на allsoft и возникает необходимость сделать выдачу полной версии программы по лицензионному ключу. В PHP разбираюсь не очень хорошо, сделал простой скрипт, который это реализует. Пожалуйста, посмотрите на него - есть ли какие-нибудь подводные камни у Apache\PHP которые позволят обходным путём получить этот файл или вторгнуться в БД?

В папке private находятся exe-шники программ. Также там находится .htaccess, который блокирует доступ в эту папку по обычным запросам:
Deny from all

Далее - пользователь может составить get-запрос к файлу get.php, который проверяет ключ на наличие в таблице и выдаёт файл если всё впорядкe

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$db = "db";

$dbh = new PDO("mysql:host=$servername;dbname=$db", $username, $password);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$key = $_GET["key"];
$version = (int) $_GET["version"];

$stmt = $dbh->prepare("SELECT count(*) FROM `serial_keys` WHERE `key_str`= :kk");
$stmt->bindParam(":kk", $key);
$stmt->execute();

$number_of_rows = $stmt->fetchColumn(); 

if($number_of_rows == 1){
    $file = "private/$version.exe";

    header('Content-Type: application/octet-stream');
    header("Content-Transfer-Encoding: Binary"); 
    header("Content-disposition: attachment; filename=\"App.exe\""); 
    header('Content-Length: ' . filesize($file));
    readfile("$file");
}else{
    echo "Неверный ключ!";
}


Запрос вида site.com/get.php?key=DDD-XXX-BBB&version=1
  • Вопрос задан
  • 216 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Atllantis
Если честно, то реализация ужасная!
readfile() читает В БУФЕР и выдаёт клиенту содержимое уже из буфера. И пока клиент не получит, буфер будет заполнен файлом и более того, если одновременно будет запрошено 1000 файлов по 2 Мб каждый... Думаю представляете сколько памяти потребуется для этого...
В место readfile() подменяйте ссылку (редирект) и возвращайте файл сервером. Т.о. настоящую ссылку на файл никто не увидит и файл будет отдаваться сервером, что однозначно лучше чем php скриптом.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы