Рубрики
Uncategorized

Используйте только операторы запросов Laravel Eloquent в проектах PHP, чтобы избежать внедрения SQL

Автор оригинала: David Wong.

OWASP (Проект безопасности открытых веб-приложений) – это проект, который регистрирует угрозы для текущих веб-приложений. Я все время следил за их веб-сайтами и обнаружил некоторое сходство в отчетах за 2010, 2013 и 2017 годы с SQL или другими типами угроз внедрения в верхней части списка.

Это серьезная проблема.

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

Что такое инъекция?

Так называемая инъекция заключается в том, что данные не фильтруются, а ненадежный контент записывается непосредственно в системный интерпретатор. Такое поведение приведет к внедрению SQL на сайт, и, что еще хуже, злоумышленник может получить полный доступ к системе.

Например:

Посмотрите на следующую инструкцию вредоносного запроса, которая поместит вредоносную инструкцию SQL в $name В переменных, а затем разрешить пользователям проходить через ПОСТ Путь передается PHP-скрипту, чтобы достичь конечной цели использования входящего вредоносного кода для атаки.

//Напишите вредоносный код, ПЕРЕТАЩИТЕ ТАБЛИЦУ в переменную $name `$name;\ $query;`

После синтаксического анализа PHP-скрипта в конечном итоге будут сгенерированы такие операторы SQL: ВЫБЕРИТЕ * ИЗ пользователей, ГДЕ;УДАЛИТЕ пользователей ТАБЛИЦЫ; -- '

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

Как сказал Йода:

Это слишком опасно. Да, это слишком опасно.

Как предотвратить вредоносное внедрение PHP-приложений?

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

Как это сделать? Параметрические запросы используются для форматирования данных и отделения инструкций запроса от данных.

Использование параметризованных запросов гарантирует, что программа находится вдали от риска внедрения.

Примерами являются следующие:

`$statement = $db->подготовка(‘ВЫБЕРИТЕ * ИЗ таблицы, ГДЕ id = ? и имя = ?’); \ $оператор->выполнить([1, “Отметить”]);`

Кроме того, существует безопасный способ использовать ORM (Объектно-реляционное сопоставление) или конструктор запросов в проекте.

Я бы рекомендовал Eloquent, который также используется известным PHP-фреймворком Laravel. Далее я научу вас, как его установить и использовать. Это может помочь нам выполнить хорошую работу по форматированию данных, чтобы эффективно избежать опасности инъекций.

Более подробную информацию об Eloquent можно найти в документах laravel.

Установите Красноречивый

Мертвая работа

Убедитесь, что у вас установлены PHP и Composer.

Начнем формально

Лучше всего установить ПЗУ в начале проекта.

Предположим, мы хотим создать приложение для блога, содержащее таблицу сообщений и таблицу пользователей.

Конфигурация инициализации

Первое, что нужно сделать, – это создать композитора. Файл JSON для программы. Вы можете запустить его на терминале. инициализация композитора Следуйте инструкциям на терминале.

Когда он попросит вас определить зависимости, напишите осветите/базу данных Конечный результат должен быть таким же, как показано на рисунке выше. Теперь вы можете просмотреть этот пункт. установка композитора Для установки соответствующих зависимостей.

Или, если он у вас уже есть. composer.json Этот файл можно ввести непосредственно в терминале. композитору требуется осветить/базу данных Для установки соответствующих зависимостей.

Теперь нам нужно создать в корневом каталоге приложение. начало. php Файл и вставьте в файл следующий код. Я объясню их роль ниже.

require "vendor/autoload.php";
// If you want the errors to be shown*
error_reporting(E_ALL);
ini_set('display_errors', '1');
use Illuminate\Database\Capsule\Manager as Capsule;

 $capsule = new Capsule;

 $capsule->addConnection([
    "driver" => "mysql",
    "host" =>"127.0.0.1",
    "database" => "test",
    "username" => "root",
    "password" => "root"
 ]);
// Make this Capsule instance available globally. * To enable capsule to be used globally
 $capsule->setAsGlobal();
// Setup the Eloquent ORM.
 $capsule->bootEloquent();

В первой строке нам нужно представить поставщика/autoload.php Документы. Чтобы мы могли загрузить поставщику Все пакеты в каталоге.

Затем мы вводим используем Illuminate\База данных\Капсула\Менеджер в качестве капсулы И дайте ему псевдоним, чтобы мы могли использовать красноречивый.

Затем давайте создадим объект Capsule и инициализируем подключение к базе данных, как указано выше boot Eloquent() .

Теперь, очевидно, первое, что нам нужно сделать, это создать имя под названием тест Убедитесь, что вы ввели правильное имя пользователя и пароль локально в своей базе данных.

Миграции/Миграция Данных

Одним из величайших преимуществ использования Красноречия является использование миграций.

Если вы не знаете, что такое миграции, вы можете увидеть следующее объяснение:

Миграция-это способ создания таблиц данных с помощью PHP-кода.

останься migrations.php Создать миграцию:

require "start.php";
use Illuminate\Database\Capsule\Manager as Capsule;
Capsule::schema()->create('users', function ($table) {
   $table->increments('id');
   $table->string('name');
   $table->string('email')->unique();
   $table->string('password');
   $table->timestamps();
});
Capsule::schema()->create('posts', function ($table) {
   $table->increments('id');
   $table->string('title');
   $table->text('body');
   $table->integer('created_by')->unsigned();
   $table->timestamps();
});

Приведенный выше код создает две таблицы с помощью класса Capsule. Один из них пользователи Другая – это стол. записи Для них определены таблицы и имена полей.

Запустите этот файл. Если вы видите белый экран, миграция выполняется успешно. Теперь вы можете открыть базу данных, чтобы узнать, были ли сгенерированы эти две таблицы.

Модели

Теперь единственное, что вам нужно сделать, это создать класс модели для соответствующей таблицы данных.

С помощью Eloquent вы можете манипулировать соответствующими таблицами и выполнять запросы в классе модели.

Создайте Модели Папки, а затем создайте их отдельно Создайте Модели Папки, а затем создайте их отдельно

namespace Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
   /**
    * Corresponding data tables
    *
    * @var string
    */
    protected $table = "users";
   /**
    * fields allowed to be inserted
    *
    * @var array
    */
    protected $fillable = [
        'name', 'email', 'password'
    ];
   /**
    * Fields that need to be hidden
    *
    * @var array
    */
    protected $hidden = [
        'password', 'remember_token',
    ];
   /*
    * Adding methods to User classes
    *
    */
    public function posts()
    {
        return $this->hasMany(Post::class, 'created_by');
    }
}

И

namespace Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
   /**
    * Corresponding data tables
    *
    * @var string
    */
    protected $table = "posts";
  /**
   * fields allowed to be inserted
   *
   * @var array
   */
   protected $fillable = [
       'title', 'body', 'created_by'
   ];
 }

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

"autoload": {
    "classmap": [
        "Models" // Folder where all your models are
     ]
}

Затем выполните дамп-автозапуск композитора

Управление базой данных с помощью красноречивого

Основной успех был достигнут. Протестируйте его, создайте в корневом каталоге index.php Файл, добавьте следующий код:

require "start.php";
use Models\User;
use Models\Post;
User::create(
 [
  'name' => 'Mark Mike',
  'email' => '[email protected]',
  'password' => '1234'
 ]
);
Post::create(
 [
  'title' => 'New Blog Post',
  'body' => 'New Blog Content',
  'created_by' => 1
 ]
);
print_r(User::all());
print_r(Post::all());
print_r(User::find(1)->posts);

Как вы можете видеть, управлять базой данных с помощью Eloquent так же просто. Кроме того, Eloquent предоставляет вам множество способов его использования, и это безопасно.

Вывод:

Красноречивый-это как добавление уровня безопасности в ваш SQL-запрос, который может отфильтровывать ошибки, которые мы допускаем при выполнении SQL-запроса. Если вы хотите использовать его, но не хотите устанавливать фреймворк Laravel, я думаю, вы узнали, как это сделать, из этой статьи. Этот элегантный помощник по SQL поможет вам писать более чистый и безопасный код.

От: https://learnku.com/php/t/25962

Дополнительные статьи: https://learnku.com/php/c/tra…