Перечислите или перечислите все переменные в программе [Ваш любимый язык здесь] [закрытый]

Несколько рекомендаций по экранированию специальных символов в операторах SQL.

Не используйте MySQL , это расширение устарело, используйте MySQLi или PDO .

MySQLi

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

Пример:

$mysqli = new mysqli( 'host', 'user', 'password', 'database' );
$mysqli->set_charset( 'charset');

$string = $mysqli->real_escape_string( $string );
$mysqli->query( "INSERT INTO table (column) VALUES ('$string')" );

Для автоматического экранирования значений с помощью подготовленных операторов , используйте mysqli_prepare и mysqli_stmt_bind_param , где для соответствующего преобразования должны быть указаны типы для соответствующих переменных связывания:

Пример:

$stmt = $mysqli->prepare( "INSERT INTO table ( column1, column2 ) VALUES (?,?)" );

$stmt->bind_param( "is", $integer, $string );

$stmt->execute();

Независимо от того, используете ли вы подготовленные операторы или mysqli_real_escape_string, вам всегда нужно знать тип входных данных, с которыми вы работаете.

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

И использование mysqli_real_escape_string для, как сказано в названии, означает экранирование специальных символов в строке, поэтому оно не сделает целые числа безопасными. Цель этой функции - предотвратить разрыв строк в операторах SQL и повреждение базы данных, которое она может вызвать. mysqli_real_escape_string - полезная функция при правильном использовании, особенно в сочетании с sprintf.

Пример:

$string = "x' OR name LIKE '%John%";
$integer = '5 OR id != 0';

$query = sprintf( "SELECT id, email, pass, name FROM members WHERE email ='%s' AND id = %d", $mysqli->real_escape_string( $string ), $integer );

echo $query;
// SELECT id, email, pass, name FROM members WHERE email ='x\' OR name LIKE \'%John%' AND id = 5

$integer = '99999999999999999999';
$query = sprintf( "SELECT id, email, pass, name FROM members WHERE email ='%s' AND id = %d", $mysqli->real_escape_string( $string ), $integer );

echo $query;
// SELECT id, email, pass, name FROM members WHERE email ='x\' OR name LIKE \'%John%' AND id = 2147483647

77
задан Community 23 May 2017 в 11:54
поделиться

14 ответов

В Python, с помощью местных жителей, который возвращает словарь, содержащий всю локальную привязку, таким образом, избегая оценки:

>>> foo1 = "Hello world"
>>> foo2 = "bar"
>>> foo3 = {"1":"a",
...         "2":"b"}
>>> foo4 = "1+1"

>>> import pprint
>>> pprint.pprint(locals())
{'__builtins__': <module '__builtin__' (built-in)>,
 '__doc__': None,
 '__name__': '__main__',
 'foo1': 'Hello world',
 'foo2': 'bar',
 'foo3': {'1': 'a', '2': 'b'},
 'foo4': '1+1',
 'pprint': <module 'pprint' from '/usr/lib/python2.5/pprint.pyc'>}
91
ответ дан Aaron Maenpaa 24 November 2019 в 10:54
поделиться

В Java проблема была бы подобна C#, только в более подробном режиме (я знаю, я ЗНАЮ ;) Java является подробным... Вы уже ясно дали понять;) )

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

package test;

import java.lang.reflect.Field;
import java.security.AccessController;
import java.security.PrivilegedAction;

/**
 * 
 * @author <a href="https://stackoverflow.com/users/6309/vonc">VonC</a>
 */
public class DisplayVars
{

    private static int field1 = 1;
    private static String field2 = "~2~";
    private boolean isField = false;

    /**
     * @param args
     */
    public static void main(final String[] args)
    {
        final Field[] someFields = DisplayVars.class.getDeclaredFields();
        try
        {
            displayFields(someFields);
        } catch (IllegalAccessException e)
        {
            e.printStackTrace();
        }
    }

    /**
     * @param someFields
     * @throws IllegalAccessException
     * @throws IllegalArgumentException
     */
    @SuppressWarnings("unchecked")
    public static void displayFields(final Field[] someFields)
            throws IllegalAccessException
    {
        DisplayVars anObject = new DisplayVars();
        Object res = null;
        for (int ifields = 0; ifields < someFields.length; ifields++)
        {
            final Field aField = someFields[ifields];
            AccessController.doPrivileged(new PrivilegedAction() {
                public Object run()
                {
                    aField.setAccessible(true);
                    return null; // nothing to return
                }
            });
            res = aField.get(anObject);
            if (res != null)
            {
                System.out.println(aField.getName() + ": " + res.toString());
            } else
            {
                System.out.println(aField.getName() + ": null");
            }
        }
    }
}
2
ответ дан Community 24 November 2019 в 10:54
поделиться

Perl. Не обрабатывает my местные жители и не отфильтровывает некоторые бесполезные ссылки, но все в объеме пакета видно.

my %env = %{__PACKAGE__ . '::'};
while (($a, $b) = each %env) {
    print "\$a = $b\n";
    print "\@$a = (@$b)\n";
    print "%$a = (@{[%$b]})\n";
    print "*$a = $b\n";
}
4
ответ дан ephemient 24 November 2019 в 10:54
поделиться

В php Вы могли сделать это:

$defined = get_defined_vars(); 
foreach($defined as $varName => $varValue){
 echo "$varName is of type ".gettype($varValue)." and has value $varValue <br>";
}
9
ответ дан Pim Jager 24 November 2019 в 10:54
поделиться

Это - то, на что это было бы похоже в Ruby:

#!/usr/bin/env ruby

foo1 = 'Hello world'
foo2 = 'bar'
foo3 = { '1' => 'a', '2' => 'b' }
foo4 = '1+1'

b = binding
local_variables.each do |var|
  puts "#{var} is #{var.class} and is equal to #{b.local_variable_get(var).inspect}"
end

, который произведет

foo1 is String and is equal to "Hello world"
foo2 is String and is equal to "bar"
foo3 is String and is equal to {"1"=>"a", "2"=>"b"}
foo4 is String and is equal to "1+1"

Однако, разве Вы не означали производить тип объекта, ссылки на переменную вместо типа раньше представляли идентификатор переменной? IOW, тип foo3 должен быть Hash (или dict) вместо String, правильно? В этом случае код был бы

#!/usr/bin/env ruby

foo1 = 'Hello world'
foo2 = 'bar'
foo3 = { '1' => 'a', '2' => 'b' }
foo4 = '1+1'

b = binding
local_variables.each do |var|
  val = b.local_variable_get(var)
  puts "#{var} is #{val.class} and is equal to #{val.inspect}"
end

, и результат

foo1 is String and is equal to "Hello world"
foo2 is String and is equal to "bar"
foo3 is Hash and is equal to {"1"=>"a", "2"=>"b"}
foo4 is String and is equal to "1+1"
11
ответ дан Jörg W Mittag 24 November 2019 в 10:54
поделиться

Во-первых, я просто использовал бы отладчик; Visual Studio-p, например, имеет окна "Locals" и "Watch", которые покажут все переменные и т.д., Вы хотите, полностью расширяемый к любому уровню.

В C# Вы не можете действительно достигнуть переменные метода очень легко (и они многие хорошо быть удаленными компилятором) - но можно получить доступ к полям и т.д. через отражение:

static class Program { // formatted for minimal vertical space
    static object foo1 = "Hello world", foo2 = "bar",
                  foo3 = new[] { 1, 2, 3 }, foo4;
    static void Main() {
        foreach (var field in typeof(Program).GetFields(
                BindingFlags.Static | BindingFlags.NonPublic)) {
            var val = field.GetValue(null);
            if (val == null) {
                Console.WriteLine("{0} is null", field.Name);
            } else {
                Console.WriteLine("{0} ({1}) = {2}",
                    field.Name, val.GetType().Name, val);
            }
        }
    }
}
4
ответ дан Marc Gravell 24 November 2019 в 10:54
поделиться

Вот идея для oo-языков.

Сначала вам понадобится что-то вроде toString () в Java, чтобы напечатать осмысленное содержимое. Во-вторых, вы должны ограничиться одной иерархией объектов. В конструкторе корневого объекта (например, Any в Eiffel) вы регистрируете экземпляр при создании в каком-то глобальном списке. Во время уничтожения вы отменяете регистрацию (обязательно используйте некоторую структуру данных, которая позволяет быстро вставлять / искать / удалять). В любой момент во время выполнения программы вы можете пройти через эту структуру данных и распечатать все зарегистрированные в ней объекты.

Благодаря своей структуре, Eiffel может быть очень хорош для этой цели. Другие языки имеют проблемы с объектами, которые не определены пользователем (например, jdk-классы). В Java можно создать свой собственный объектный класс, используя некоторый открытый исходный код jdk.

0
ответ дан 24 November 2019 в 10:54
поделиться

Common Lisp:

(do-all-symbols (x) (print x))

Чтобы также показать все связанные значения:

(do-all-symbols (x) (print x) (when (boundp x) (print (symbol-value x))))

Это длинный список, который не особенно полезен. Я бы действительно использовал встроенный отладчик.

0
ответ дан 24 November 2019 в 10:54
поделиться

Быстрое и грязное решение для JavaScript, если у вас установлен FireBug (или другой браузер с console.log). Если вы этого не сделаете, вам придется изменить console.log на document.write и запустить его как встроенный скрипт в конце вашего. Измените MAX_DEPTH на количество уровней рекурсии, которое вы хотите (будьте осторожны!).

(function() {
    var MAX_DEPTH = 0;
    function printObj(name, o, depth) {
        console.log(name + " type: '"+typeof o+"' value: " + o);

        if(typeof o == "function" || depth >= MAX_DEPTH) return;
        for(var c in o) {
            printObj(name+"."+c, o[c], depth+1);
        }
    }
    for(var o in window) {
        printObj(o, window[o], 0);
    }
})();
1
ответ дан 24 November 2019 в 10:54
поделиться

Полностью рекурсивный однострочник PHP:

print_r(get_defined_vars());
6
ответ дан 24 November 2019 в 10:54
поделиться

Matlab:

who
4
ответ дан 24 November 2019 в 10:54
поделиться

В REBOL все переменные находятся внутри контекста объекта типа ! . Существует глобальный контекст, и каждая функция имеет свой собственный неявный локальный контекст. Вы можете создавать новые контексты явно, создав новый объект ! (или используя функцию context ). Это отличается от традиционных языков, потому что переменные (называемые "словами" в REBOL) несут ссылку на свой контекст вокруг себя, даже когда они вышли из "области", в которой они были определены.

Итак, суть в том, что, учитывая контекст, мы можем перечислить переменные, которые он определяет . Мы воспользуемся функцией Ладислава Мецира context-words? .

context-words?: func [ ctx [object!] ] [ bind first ctx ctx ]

Теперь мы можем перечислить все слова, определенные в глобальном контексте. (Их много .)

probe context-words? system/words

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

enumerable: func [a b c /local x y z] [
  probe context-words? bind? 'a
]

То, что мы не можем сделать в REBOL, насколько я знаю, это прогулка по контекстному дереву, хотя интерпретатор, кажется, может делать это отлично, когда решает, как связать слова с их контекстами. Я думаю, это связано с тем, что контекстное дерево (т.е. область видимости) может иметь одну «форму» во время привязки слова, но совсем другую в то время, когда оно '

1
ответ дан 24 November 2019 в 10:54
поделиться

Bash:

set

Предупреждение: не мой любимый язык!

6
ответ дан 24 November 2019 в 10:54
поделиться

В Lua основной структурой данных является таблица и даже глобальное окружение _G - это таблица. Итак, простое перечисление поможет.

for k,v in pairs(_G) do
  print(k..' is '..type(v)..' and is equal to '..tostring(v))
end
9
ответ дан 24 November 2019 в 10:54
поделиться
Другие вопросы по тегам:

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