#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