Конкатенация строк в Ruby

Параметрированный запрос И проверка ввода - это путь. Существует множество сценариев, в которых может произойти SQL-инъекция, хотя используется mysql_real_escape_string().

Эти примеры уязвимы для SQL-инъекции:

$offset = isset($_GET['o']) ? $_GET['o'] : 0;
$offset = mysql_real_escape_string($offset);
RunQuery("SELECT userid, username FROM sql_injection_test LIMIT $offset, 10");

или

$order = isset($_GET['o']) ? $_GET['o'] : 'userid';
$order = mysql_real_escape_string($order);
RunQuery("SELECT userid, username FROM sql_injection_test ORDER BY `$order`");

В обоих случаях вы не можете использовать ' для защиты инкапсуляции.

Источник : Непредвиденная инъекция SQL (при эвакуации Недостаточно)

350
задан idmean 2 May 2015 в 08:24
поделиться

5 ответов

Можно сделать это несколькими способами:

  1. Как Вы показанный с <<, но это не обычно путь
  2. Со строковой интерполяцией

    source = "#{ROOT_DIR}/#{project}/App.config"
    
  3. с +

    source = "#{ROOT_DIR}/" + project + "/App.config"
    

, второй метод, кажется, более эффективен с точки зрения памяти/скорости от того, что я видел (не измеренный хотя). Все три метода бросят неинициализированную постоянную ошибку, когда ROOT_DIR будет нолем.

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

В конце, это - вопрос вкуса.

555
ответ дан scarver2 23 November 2019 в 00:26
поделиться

+ оператор является нормальным выбором конкатенации и является, вероятно, самым быстрым способом связать строки.

различие между + и << - то, что << изменения объект на его левой стороне, и + не делает.

irb(main):001:0> s = 'a'
=> "a"
irb(main):002:0> s + 'b'
=> "ab"
irb(main):003:0> s
=> "a"
irb(main):004:0> s << 'b'
=> "ab"
irb(main):005:0> s
=> "ab"
92
ответ дан Rimian 23 November 2019 в 00:26
поделиться

Если Вы просто связываете пути, можно использовать собственный метод Ruby File.join.

source = File.join(ROOT_DIR, project, 'App.config')
77
ответ дан georg 23 November 2019 в 00:26
поделиться

Так как это - путь, я, вероятно, использовал бы массив и соединение:

source = [ROOT_DIR, project, 'App.config'] * '/'
10
ответ дан Dejan Simic 23 November 2019 в 00:26
поделиться

Я бы предпочел использовать Pathname:

require 'pathname' # pathname is in stdlib
Pathname(ROOT_DIR) + project + 'App.config'

о << и + из рубиновых документов:

+: Возвращает новую строку, содержащую строку other_str, связанную со строкой str

<<: Концентрирует данный объект в строку str. Если объект является Fixnum между 0 и 255, то перед конкатенацией он преобразуется в символ.

так что разница заключается в том, что становится первым операндом (<< вносит изменения, + возвращает новую строку, поэтому память тяжелее), и что будет, если первым операндом будет Fixnum (<< добавит, как если бы это был символ с кодом, равным этому числу, + приведет к ошибке)

.
6
ответ дан 23 November 2019 в 00:26
поделиться
Другие вопросы по тегам:

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