Параметрированный запрос И проверка ввода - это путь. Существует множество сценариев, в которых может произойти 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 (при эвакуации Недостаточно)
Можно сделать это несколькими способами:
<<
, но это не обычно путь Со строковой интерполяцией
source = "#{ROOT_DIR}/#{project}/App.config"
с +
source = "#{ROOT_DIR}/" + project + "/App.config"
, второй метод, кажется, более эффективен с точки зрения памяти/скорости от того, что я видел (не измеренный хотя). Все три метода бросят неинициализированную постоянную ошибку, когда ROOT_DIR будет нолем.
При контакте с путями, можно хотеть использовать File.join
, чтобы не портить с разделителем пути.
В конце, это - вопрос вкуса.
+
оператор является нормальным выбором конкатенации и является, вероятно, самым быстрым способом связать строки.
различие между +
и <<
- то, что <<
изменения объект на его левой стороне, и +
не делает.
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"
Если Вы просто связываете пути, можно использовать собственный метод Ruby File.join.
source = File.join(ROOT_DIR, project, 'App.config')
Так как это - путь, я, вероятно, использовал бы массив и соединение:
source = [ROOT_DIR, project, 'App.config'] * '/'
Я бы предпочел использовать Pathname:
require 'pathname' # pathname is in stdlib
Pathname(ROOT_DIR) + project + 'App.config'
о <<
и +
из рубиновых документов:
+
: Возвращает новую строку, содержащую строку other_str, связанную со строкой str
<<
: Концентрирует данный объект в строку str. Если объект является Fixnum между 0 и 255, то перед конкатенацией он преобразуется в символ.
так что разница заключается в том, что становится первым операндом (<<
вносит изменения, +
возвращает новую строку, поэтому память тяжелее), и что будет, если первым операндом будет Fixnum (<<
добавит, как если бы это был символ с кодом, равным этому числу, +
приведет к ошибке)