Хорошая идея состоит в том, чтобы включить jmx (лямбда-зонд) на рабочем сервере?

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

У вас в основном есть два варианта:

  1. Использование PDO (для любой поддерживаемый драйвер базы данных):
    $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
    
    $stmt->execute(array('name' => $name));
    
    foreach ($stmt as $row) {
        // do something with $row
    }
    
  2. Использование MySQLi (для MySQL):
    $stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
    $stmt->bind_param('s', $name); // 's' specifies the variable type => 'string'
    
    $stmt->execute();
    
    $result = $stmt->get_result();
    while ($row = $result->fetch_assoc()) {
        // do something with $row
    }
    

Если вы подключаетесь к база данных, отличная от MySQL, есть вторая опция, зависящая от драйвера, к которой вы можете обратиться (например, pg_prepare() и pg_execute() для PostgreSQL). PDO является универсальной опцией.

Правильная настройка соединения

Обратите внимание, что при использовании PDO для доступа к базе данных MySQL real подготовленные операторы не используются по умолчанию. Чтобы исправить это, вы должны отключить эмуляцию подготовленных операторов. Пример создания соединения с использованием PDO:

$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');

$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

В приведенном выше примере режим ошибки не является абсолютно необходимым, но рекомендуется добавить его. Таким образом, сценарий не остановится с Fatal Error, когда что-то пойдет не так. И это дает разработчику шанс catch получить любую ошибку (ы), которые являются throw n как PDOException s.

Однако обязательной является первая setAttribute() строка, которая сообщает PDO об отключении эмулируемых подготовленных операторов и использует подготовленные операторы real . Это гарантирует, что оператор и значения не будут разбираться с PHP перед отправкой на сервер MySQL (предоставление возможности злоумышленнику возможности внедрить вредоносный SQL).

Хотя вы можете установить charset в варианты конструктора, важно отметить, что «более старые» версии PHP (& lt; 5.3.6) молча игнорировали параметр charset в DSN.

Объяснение

Случается, что оператор SQL, который вы передаете prepare, анализируется и компилируется сервером базы данных. Указав параметры (либо ?, либо именованный параметр, такой как :name в примере выше), вы указываете механизм базы данных, в который вы хотите включить фильтр. Затем, когда вы вызываете execute, подготовленный оператор объединяется со значениями параметров, которые вы указываете.

Важно то, что значения параметров объединены с компилируемым оператором, а не с строкой SQL. SQL-инъекция работает, обманывая сценарий, включая вредоносные строки, когда он создает SQL для отправки в базу данных. Поэтому, отправляя фактический SQL отдельно от параметров, вы ограничиваете риск того, что закончите то, чего не намеревались. Любые параметры, которые вы отправляете при использовании подготовленного оператора, будут обрабатываться только как строки (хотя механизм базы данных может сделать некоторую оптимизацию, поэтому, конечно, параметры могут также оказаться как числа). В приведенном выше примере, если переменная $name содержит 'Sarah'; DELETE FROM employees, результатом будет просто поиск строки "'Sarah'; DELETE FROM employees", и вы не получите пустую таблицу .

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

О, и поскольку вы спросили, как это сделать для вставки, вот пример (с использованием PDO):

$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');

$preparedStatement->execute(array('column' => $unsafeValue));

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

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

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

// Value whitelist
// $dir can only be 'DESC' otherwise it will be 'ASC'
if (empty($dir) || $dir !== 'DESC') {
   $dir = 'ASC';
}

23
задан 10 revs, 2 users 79% 19 April 2017 в 21:37
поделиться

5 ответов

Можно вычеркнуть дефекты безопасности при помощи безопасной аутентификации. Просто хранение готового сервиса JMX не подвергается никаким значительным издержкам и обычно является хорошей идеей. Существует сравнительный тест здесь об этом.

17
ответ дан JtR 29 November 2019 в 02:42
поделиться

Издержки от JMX являются низкими, и можно зафиксировать безопасность с помощью Гєsing SSL и аутентификации. Набор-Dcom.sun.management.jmxremote.ssl=true и-Dcom.sun.management.jmxremote.authenticate=true

Видят здесь для здесь для получения дополнительной информации об установке сертификатов и т.д.

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

, Если бы Вы хотите низко наверху, я использовал бы инструменты, которые идут JRockit. Они осуществляют контрейлерные перевозки на информации, которую JVM собирает все время. JVM сохраняет статистику, которой методы являются выполнением больше всего для решения, какие методы это должно оптимизировать. JVM также отслеживает использование памяти / шаблоны для решения который gc-stategy выбрать. JRockit выставляет те добрые данные инструментам JRockit, не добавляя инструментарий наверху, Вы обычно добирались бы от отдельного JMVTI - агент.

6
ответ дан Kire Haglin 29 November 2019 в 02:42
поделиться

JMX является просто сокетом, который ожидает соединений и позволяет внешним процессам получать доступ данным, которые собраны так или иначе. Сделайте штраф является обычно очень низким (если Вы не куете сервер JMX с запросами, конечно).

JMX позволяет Вам достигать кишки своего Java VM. Существуют команды, чтобы выполнить GC и завершить работу его. Однако JMX предлагает режим безопасного соединения, который использует открытые ключи и аутентификацию. Прочитайте документы для деталей.

3
ответ дан Aaron Digulla 29 November 2019 в 02:42
поделиться

Мы используем лямбда-зонд в рабочих серверах, и мы не видели значительных издержек. Я могу рекомендовать датчик как надежный продукт, готовый к производственному использованию (Коты 5.5 и 6.0, JDK 5 и JDK 6).

2
ответ дан FoxyBOA 29 November 2019 в 02:42
поделиться

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

0
ответ дан kohlerm 29 November 2019 в 02:42
поделиться
Другие вопросы по тегам:

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