WedX - журнал о программировании и компьютерных науках

Знак доллара ($) в строке пароля рассматривается как переменная

Потратил некоторое время на устранение неполадок, из-за которых у веб-приложения PHP/MySQL возникали проблемы с подключением к базе данных. К базе данных можно было получить доступ из оболочки и phpMyAdmin с одними и теми же учетными данными, и это не имело смысла.

Оказывается, в пароле был знак $:

$_DB["password"] = "mypas$word";

Отправляемый пароль был «mypas», что явно неверно.

Каков наилучший способ справиться с этой проблемой? Я экранировал $ с помощью \

$_DB["password"] = "mypas\$word";

и это сработало.

Обычно я использую $string = 'test' для строк, и, вероятно, именно поэтому я избегал этого раньше.

Это правильное поведение? Что, если бы этот пароль хранился в базе данных, а PHP извлек его, возникла бы та же проблема? Что мне здесь не хватает...


Ответы:


1
$_DB['password'] = 'mypas$word';

Строки с одинарными кавычками не обрабатываются и принимаются "как есть". Вы всегда должны использовать строки с одинарными кавычками, если только вам не нужны замены $variable или escape-последовательностей (\n, \r и т. д.). Это быстрее и менее подвержено ошибкам.

01.04.2010
  • Спасибо за Ваш ответ. Похоже, это проблема передовой практики. Со строгими отчетами об ошибках это могло бы быть обнаружено быстрее. Из моего первоначального вопроса - может ли это быть проблемой при захвате паролей из базы данных, или PHP избежит знака $? 01.04.2010
  • @ncatnow: это не может быть проблемой, потому что замены выполняются только в строках с двойными кавычками (строка). Когда вы читаете строку из базы данных, PHP считывает ее внутри, поэтому вы не используете строки с двойными кавычками для ее установки (или даже строки с одинарными кавычками). Представьте, что компилятор заменяет все $stuff прямо перед установкой переменной. 01.04.2010
  • Это проблема только для строк, записанных непосредственно в исходном коде с использованием двойных кавычек. Они должны физически появиться "like $this" в исходном файле .php. Строки из базы данных, из файла, от пользователя и т.д. интерполяции не подлежат. 01.04.2010
  • Вы также можете избежать знака доллара: "pas\$word". 15.10.2014

  • 2

    PHP интерполирует переменную $word в строку mypas$word, что является нормальным поведением для строковых литералов, заключенных в двойные кавычки. Поскольку $word предположительно не определено, результирующая интерполированная строка будет mypas.

    Решение состоит в использовании одинарных кавычек. Строковые литералы в одинарных кавычках не подвергаются интерполяции переменных.

    01.04.2010

    3

    Все остальные ответы работают до тех пор, пока в пароль не будут встроены одинарные кавычки.

    Неудача:

    $_DB['password'] = 'my'pas$word';

    Альтернативы:

    Если у вас нет других экранированных символов, вы можете экранировать $ с помощью \$, например

    $_DB['password'] = "my'pas\$word";

    Или может быть проще избежать одинарной кавычки, например.

    $_DB['password'] = 'my\'pas$word';

    17.08.2016
  • Отлично, спасибо. Я не знал, что мы можем экранировать символы. 07.10.2016

  • 4

    Просто поместите его в строку с одинарными кавычками:

    $_DB['password'] = 'mypas$word';
    

    Строка в двойных кавычках будет интерполировать переменные, а строки в одинарных кавычках — нет. Так что это решит вашу проблему.

    01.04.2010

    5

    используйте одинарные кавычки

    $_DB["password"] = 'mypas$word';
    
    01.04.2010

    6

    Просто используйте одинарные кавычки ' вместо ", и он не будет пытаться обрабатывать $word как переменную.

    $_DB['password'] = 'mypas$word';
    
    01.04.2010

    7

    Строковые кавычки с двойными кавычками интерпретируются как переменные. Строки в одинарных кавычках интерпретируются буквально.

    $a = "one";
    $b = "$a";
    echo $b . "\n";
    $b = '$a';
    echo $b . "\n";
    

    Это должно дать:

    one
    $a
    
    01.04.2010
  • А что насчет следующего? $a содержит знак доллара (строка); $б=$а ? Я пробовал это, и, к сожалению, он не показывал знак доллара. 11.03.2012
  • Если вы поместите назначение в одинарные кавычки, оно должно появиться. $b = '$a' установит для переменной b буквальный текст '$a'. 15.03.2012
  • я имею в виду $a='Эта книга стоит 148 долларов'; $b='$a' не показывает следующий текст Эта книга стоит 148 долларов, но если $b=$a, то она пытается отобразить переменную 148 долларов (?). 19.03.2012

  • 8

    Я просто столкнулся с этой проблемой и исправил ее до того, как нашел эту тему. Я уверен, что все решения с одинарными кавычками работают идеально. Я решил просто объединить проход, который также отлично работает, поскольку я не знал о решении с одинарной кавычкой.... IE

    $db_password = "SamWise" . "$" . "GangiTYloYG"; 
    
    04.04.2017
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]