База данных PHP/SQL, запрашивающая хорошую практику и безопасность

Вы можете написать ниже запрос

db.student.aggregate([
{ $match : {'name': "Rahul" }},
{ $project :{"marks":1} }
])
7
задан Jonathan Leffler 5 May 2009 в 22:29
поделиться

6 ответов

Мои рекомендации:

  1. отказаться от mysqli в пользу PDO (с драйвером mysql)
  2. использовать подготовленные с параметрами PDO подготовленные операторы

Затем вы можете сделать что-то вроде:

$pdo_obj = new PDO( 'mysql:server=localhost; dbname=mydatabase', 
                    $dbusername, $dbpassword );

$sql = 'SELECT column FROM table WHERE condition=:condition';
$params = array( ':condition' => 1 );

$statement = $pdo_obj->prepare( $sql, 
    array( PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY ) );
$statement->execute( $params );
$result = $statement->fetchAll( PDO::FETCH_ASSOC );

PRO:

  1. Больше никакого ручного экранирования, поскольку PDO делает все за вас!
  2. Внезапно переключить серверную базу данных относительно легко.

Минусы:

  • Я не могу придумать ни одного.
6
ответ дан 6 December 2019 в 08:45
поделиться

Ответ Хавьера, имеющий ссылку owasp, является хорошим началом.

Есть еще несколько вещей, которые вы можете сделать больше:

  1. Что касается атак с использованием SQL-инъекций, вы можете написать функцию, которая удалит из ввода общие операторы SQL, такие как «DROP» или «DELETE * WHERE», например:

    * $ sqlarray = array («DROP», « или 1 = 1 "," выбор объединения "," SELECT * FROM "," выбрать хост "," создать таблицу "," ОТ пользователей "," пользователи, ГДЕ "); *

    Затем напишите функцию, которая проверит ваш ввод по этому массиву. Убедитесь, что какие-либо вещи внутри $ sqlarray не будут общими для ваших пользователей. (Не забудьте использовать strtolower, спасибо, lou).

  2. Я не уверен, работает ли memcache с PHP 4, но вы можете установить некоторую защиту от спама с помощью memcache, разрешив только определенный удаленный IP-доступ к Страница process.php X количество раз за период Y.

  3. Привилегии важны. Если вам нужны только привилегии на вставку (скажем, обработка заказа), вам следует войти в базу данных на странице процесса заказа с пользователем, у которого есть только вставка, и, возможно, выбрать привилегии. Это означает, что даже если SQL-инъекция прошла, они могли выполнять только запросы INSERT / SELECT, а не удалять или реструктурировать.

  4. Поместите важные файлы обработки php в каталог, такой как / include. Затем запретите всем IP-адресам доступ к этому каталогу / include.

  5. Поместите соленый MD5 с агентом пользователя + remoteip + ваша соль в сеанс пользователя и заставьте его проверять на каждой загрузке страницы, что правильный MD5 находится в их cookie.

  6. Запретить определенные заголовки ( http: //www.owasp.org/index.php/Testing_for_HTTP_Methods_and_XST). Запретить PUT (если вам не нужны загрузки файлов) / TRACE / CONNECT / DELETE заголовки.

9
ответ дан 6 December 2019 в 08:45
поделиться

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

Извините, я не могу предоставить больше информации, ориентированной на PHP, но надеюсь, что это поможет.

3
ответ дан 6 December 2019 в 08:45
поделиться

AFAIK, PHP / mySQL обычно не имеет параметризованных запросов.

Использование sprintf () с mysql_real_escape_string () должно работать довольно хорошо , Если вы используете соответствующие строки формата для sprintf () (например, «% d» для целых чисел), вы должны быть в безопасности.

2
ответ дан 6 December 2019 в 08:45
поделиться

I may be wrong, but shouldn't it be enough to use mysql_real_escape_string on user provided data?

unless when they are numbers, in which case you should make sure they are in fact numbers instead by using for example ctype_digit or is_numeric or sprintf (using %d or %u to force input into a number).

Also, having a serarate mysql user for your php scripts that can only SELECT, INSERT, UPDATE and DELETE is probably a good idea...


Example from php.net

Example #3 A "Best Practice" query

Using mysql_real_escape_string() around each variable prevents SQL Injection. This example demonstrates the "best practice" method for querying a database, independent of the Magic Quotes setting.

The query will now execute correctly, and SQL Injection attacks will not work.

  0) {
 echo "Товар вставлен \ n";
 }
 }
 } еще {
 echo "Заполните форму правильно \ n";
 }
1
ответ дан 6 December 2019 в 08:45
поделиться

Используйте хранимые процедуры для любого действия, связанного с записью в БД, и используйте параметры связывания для всех выборов.

0
ответ дан 6 December 2019 в 08:45
поделиться
Другие вопросы по тегам:

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