Безопасный способ создать URL-адрес, который принимает входные данные и сохраняет в базе данных - PullRequest
0 голосов
/ 17 ноября 2010

Давайте представим, что у вас была задача создать URL (например, одну веб-страницу), который получает входные данные (например, GET и / или POST) и должен очистить и безопасно сохранить эти входные данные в базе данных.Кроме того, должно быть легко отправлять данные на этот URL практически из любого приложения, независимо от того, на каком языке оно написано.

Как бы вы справились с этой задачей safe способом?

(Я имею в виду Яма Успеха , в отличие от простого создания сценария PHP, который делает меня широко открытым для SQL-инъекции .)

РЕДАКТИРОВАТЬ: я изменил название и некоторые ключевые слова в ответ на некоторые ответы.Я публиковал этот вопрос как обсуждение безопасности и безопасности для тех, кто может быть новичком в веб-разработке.Я не говорю о защите всех уровней в параноидальной степени, просто об минимальной безопасности в обработке пользовательского ввода.Ответы, которые я предполагал, в дополнение к обсуждению вопросов безопасности, будут примерами кода, который выполняет поставленную задачу.Я приведу свой собственный ответ (на PHP) в качестве примера того, что я имею в виду.

Кроме того, я надеюсь, что это станет вики сообщества.

Ответы [ 3 ]

0 голосов
/ 18 ноября 2010

Не бывает быстрого способа сделать что-то, что также должно быть безопасным.

Основная часть тяжелой работы - это понимание, а не реализация.

Это также сильно зависит от вида данных.Например, информация о кредитной карте или номера американских социальных дингсбумов подпадают под определенные законы и должны надежно храниться в базе данных, пароли должны быть засолены и хешированы, чтобы даже администраторы БД не могли снова получить личный пароль пользователя и т. Д. И т. Д. Это не тольковопрос защиты технических транспортных уровней, а также самих данных.

Означает ли "безопасность" также, что данные, которые вы получаете "почти из всех приложений", можно доверять каким-либо образом?Если app1 отправляет данные, но маскируется под app2 - это небезопасно?Как вы идентифицируете систему / человека, откуда произошли данные?IP-адреса могут быть подделаны, обратным DNS-сервером можно манипулировать и т. Д.

0 голосов
/ 19 ноября 2010

Как и было обещано, вот пример получения ввода и его сохранения в базе данных mysql безопасным способом (по крайней мере, он должен предотвратить проблемы с внедрением SQL). Пожалуйста, поправьте меня, если я ошибаюсь. (Обратите внимание, что единственный вход - из переменной msg, которая может быть из GET, POST или cookie .)

<?php
try {
    $db = new PDO('mysql:host=$hostUri;dbname=$dbName', $user, $pass, array(
        PDO::ATTR_PERSISTENT => true
    ));
    $s = $db->prepare("INSERT INTO $dbName.$tableName (message) VALUES (:msg)");
    $dbData = array(':msg' => $_REQUEST['msg']);
    $s->execute($dbData);
    print "Added to database";
} catch (PDOException $e) {
    // Sensitive information can be displayed if this exception isn't handled
    //print "Error!: " . $e->getMessage() . "<br/>";
    die("PDO error");
}
?>

Дополнительная информация о PDO в PHP.

Этот код можно вызвать, просто включив переменную в URL (например, http://example.com/?msg=MyMessage) или по коду (пример ниже на C #, благодаря этот ответ ).

using (var client = new System.Net.WebClient())
{
    byte[] response = client.UploadValues(
        "http://example.com/", 
        new System.Collections.Specialized.NameValueCollection { { "msg", "MyMessage" }});
    Console.WriteLine(System.Text.Encoding.UTF8.GetString(response));
}
0 голосов
/ 17 ноября 2010

Ну, безопасность может означать много разных вещей. В пути (SSL), в состоянии покоя (базы данных и, возможно, шифрование файловой системы) и даже при просмотре размещенной информации (XSS и др.).

Теперь, пожалуйста, просто не используйте GET-запрос для передачи данных в вашу систему. Это не то, для чего нужен GET, он должен использоваться для получения ресурса. Отсюда и название. С другой стороны, POST передает данные в вашу систему.

Самый простой способ - просто принять обычный POST. Любой веб-язык и многие другие могут сделать это.

Сайт должен использовать SSL, чтобы обеспечить шифрование данных на пути к вам. Вы должны использовать параметризованные запросы (как минимум) для защиты от внедрения SQL. И вы должны очистить данные любых недопустимых символов. Далее зашифруйте данные перед хранением. Кстати, продолжайте и зашифруйте соединение между вашим веб-сервером и сервером базы данных. И для действительно параноика зашифруйте всю файловую систему, на которой работает база данных.

Все сказано и сделано, вам не понадобится больше пары часов, чтобы собрать все это; в зависимости, конечно, от того, что вам нужно для установки SSL на вашем сервере, и возможностей, которые ваша серверная среда предлагает для других элементов.

...