Переменная троичного оператора и mysql?

#php #mysql #security

#php #mysql #Безопасность

Вопрос:

Сработает ли это?

 $username = mysql_real_escape_string(isset($_POST['username'])) ? $_POST['username'] : '';
  

Я знаю, что троичный оператор будет работать, но как насчет реального выхода? И как я могу проверить для дальнейшего использования, если реальный escape успешен?

Спасибо

Комментарии:

1. Я бы разбил это на отдельные операторы, а не делал все встроенным подобным образом. Это чище, легче читается и проще добавить дополнительную логику.

2. Троичный файл должен быть user для простых случаев. если у вас возникли проблемы с чтением конструкции в тернарном, особенно с вызовами функций и вложенными скобками, как у вас, то это слишком сложно и, вероятно, должно выполняться как обычный if / then / else.

3. Да, я понял, но я хочу научиться правильно их использовать 🙂

4. нет, это вообще не сработает, очевидно, вы даже не пытались его запустить.

5. Я запустил его, и это сработало, троичный сделал. Если вы перечитаете мой вопрос, я добавлю, как проверить, сработал ли реальный escape.

Ответ №1:

Ваш код экранирует условие троичного выражения, а не результат.

 $username = mysql_real_escape_string(isset($_POST['username']) ? $_POST['username'] : '');
  

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

 $username = isset($_POST['username']) ? mysql_real_escape_string($_POST['username']) : '';
  

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

 function escape_val($arr, $key, $default = ''){
    return mysql_real_escape_string(isset($arr[$key]) ? $arr[$key] : $default);
}

$username = escape_val($_POST, 'username');
$some_other = escape_val($_POST,'key','default_value');
  

Комментарии:

1. -1 из-за вашей неправильной инструкции ввода: «Ваш код экранирует логическое значение из isset, а не строку, хранящуюся в $ _POST» — это неправильно, потому что оно предоставляет неверную информацию о том, как работает язык — см.: Выражения , приоритет оператора

2. @hakre: Извините, я переписал свой ответ.

3. @Basic: Это один из моих любимых фрагментов PHP. Это экономит огромное количество нажатий клавиш и помогает избежать повсеместных вызовов isset.

4. Да, это круто, я никогда не думал об этом раньше, это будет в моем файле функций. Есть идеи о том, как я могу проверить, работает ли реальный escape или нет, т.Е. проверить безопасность?

5. @GWW: Я вижу, вы отредактировали это, но «Ваш код экранирует условие тернарного выражения, а не результат». по-прежнему неверно. Код не экранирует только условное выражение, он экранирует результат полного выражения тернарного оператора. Более того, escape_val() не было бы той же проблемы.

Ответ №2:

 $username = isset($_POST['username']) ? mysql_real_escape_string($_POST['username']) : '';
//          ^ condition                 ^ value if condition returns true              ^ if false