2

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

Я пытаюсь переписать старый код с переменными переменными в $ _POST.

Я знаю, что это глупый пример, но он иллюстрирует проблему, которую я пытаюсь решить. Следующее будет работать с глобальными регистрами ON:

<?php $variable = "fullname";?> 
<form action="/test/" method="post"> 
<label for="fullname">Full Name:</label> <input name="fullname" type="text" value="<?php echo $$variable;?>" size="20" maxlength="150" /> 
<input name="submit" type="submit" value="Go!" /> 
</form> 

Как мне заставить эту работу с регистровыми глобалами отключиться? Следующее явно не работает:

<?php $variable = "fullname";?> 
<form action="/test/" method="post"> 
<label for="fullname">Full Name:</label> <input name="fullname" type="text" value="<?php echo $_POST[$$variable];?>" size="20" maxlength="150" /> 
<input name="submit" type="submit" value="Go!" /> 
</form> 

Перейдите легко на мне- я знаю, что я, наверное, глупо, но я не могу получить мою голову вокруг этого.

ответ

7

Простой, всего $_POST[$variable]. (Или $_GET или, может быть, $_REQUEST, в зависимости от обстоятельств.)

Однако обратите внимание, что при выводе текста в HTML, вы должны кодировать его, или вы будете уязвимы для кросс-сайт-сценариев атак:

<input type="text" 
    name="<?php echo htmlspecialchars($variable);?>" 
    value="<?php echo htmlspecialchars($_POST[$variable]);?>" 
    size="20" maxlength="150" 
/> 

(Я обычно определяю функцию, называемую h, которая делает echo htmlspecialchars, чтобы сократить этот избыточный объем ввода.)

+0

Теперь я чувствую себя глупо - так просто! Надеюсь, я не единственный, кто страдает от случайного замораживания мозга! – iagdotme

+0

Кстати, я проверил множество проверок безопасности на переменную, чтобы обнаружить какие-либо материалы с перекрестными скриптами, но я думаю, что пример, который у вас есть для htmlspecialchars, является хорошим, быстрым и простым. – iagdotme

+0

Я был бы обеспокоен «обнаружением XSS» на входе. На базовом уровне это не так, как работают проблемы с экранированием строк. Каждая попытка входа в XSS для входа в исходное состояние обречена на провал: она блокирует вполне допустимый ввод (например, здесь, где я набираю '

2

У меня есть некоторые формы взаимодействия, похожие на ваши, но я не могу понять, почему вы используете $ _POST в форме. Что вы должны знать:

<?php $variable = $_POST["fullname"];?> 
<form action="/test/" method="post"> 
<label for="fullname">Full Name:</label> <input name="fullname" type="text" value="<?php echo $variable; ?>" size="20" maxlength="150" /> 
<input name="submit" type="submit" value="Go!" /> 
</form> 
+0

Даниэль, технически, как он это делает, ничем не отличается от того, как вы это делаете. За исключением того факта, что вы создаете еще одну переменную. Хотя на современном дневном веб-сервере это не очень интенсивно, приятно отметить, что вы в основном играете в игру с чашкой и мячом с переменной. –

+0

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

+0

Разница в том, что я выбираю $ _POST в PHP выше формы, а не в самой форме. Это более организованный и менее вероятный разрыв –

1

$ _POST - это массив, не так ли.

$_POST[$variable] 
1

Вы уверены, что вы имели в виду $_POST[$$variable] в отличие от $_POST[$variable]

1

вы можете избавиться от всей $$ сумасшествия и просто сделать $_POST[$variable].

0

Использование переменных переменных непосредственно из $ _SUPER globals - это идея BAD и риск для безопасности, особенно если какой-либо из ваших кодов является открытым исходным кодом. Можно было бы изменить ввод, чтобы сориться и узнать значение любой переменной, которую вы пропускаете. Например, они могли бы передать «$ _ENV», который бы дал им свалку переменных среды. На самом деле, регистровые глобальные значения - это плохая идея.

Об этом говорится в ответе @ bobince.

И, что касается вашего вопроса, вот почему ваш пример не работает с отключением глобальных регистров PHP. PHP более строг (по уважительной причине) с выключенным регистром global, afaik, сложнее сделать трюк переменной переменной.

Смежные вопросы