Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: PHP5/6 в подлиннике - листинг 8.10
 
 автор: FallenAngel   (24.08.2011 в 11:48)   письмо автору
 
 

Ниже написанный код взят из книги "PHP5/6 в подлиннике". Код нерабочий. По идее он должен выводить написанную пользователем строку, причем даже если это строка какой-либо код на js или на HTML, то есть спец. символы должны заменятся. Но этого не происходит, обычную строку он выводит, но вот какой-либо код нет. Подскажите, пожалуйста, почему? Это листинг 8.10 из книги, набранный слово в слово

<?php
$error = array();
if (!empty($_POST))
{
if(empty($_POST['first'])) $error[] = "текстовое поле не заполнено";
if(empty($error))
{
echo $_POST['first'];
exit();
}
}
if(!empty($error))
{
foreach($error as $err)
{
echo "<span style=\"color:red\">$err</span><br>";
}
}
?>
<form method="post">
<input type="text" name="first" value="<?= htmlspecialchars($_POST['first'], ENT_QUOTES); ?>">
<input type="submit" value="Отправить">
</form>

  Ответить  
 
 автор: cheops   (24.08.2011 в 12:00)   письмо автору
 
   для: FallenAngel   (24.08.2011 в 11:48)
 

Понизьте уровень тревожности интерпретатора либо через директиву error_reporting php.ini, либо при помощи функции error_reporting()
<?php
  
// Выставляем уровень обработки ошибок 
  // (http://www.softtime.ru/info/articlephp.php?id_article=23)
  
error_reporting(E_ALL & ~E_NOTICE); 

  
$error = array();
  if (!empty(
$_POST))
  {
    if(empty(
$_POST['first'])) $error[] = "текстовое поле не заполнено";
    if(empty(
$error))
    {
      echo 
$_POST['first'];
      exit();
    }
  }
  if(!empty(
$error))
  {
    foreach(
$error as $err)
    {
      echo 
"<span style=\"color:red\">$err</span><br>";
    }
  }
?>
<form method="post">
<input type="text" name="first" value="<?php echo htmlspecialchars($_POST['first'], ENT_QUOTES); ?>">
<input type="submit" value="Отправить">
</form>

  Ответить  
 
 автор: FallenAngel   (24.08.2011 в 12:38)   письмо автору
 
   для: cheops   (24.08.2011 в 12:00)
 

Спасибо за уровень тревожности, так выглядит эстетичнее: нет notice в форме ввода. Кстати, почему запись <?= > не работает аналогично <?php echo ?> ? То есть когда <?= htmlspecialchars($_POST['first'], ENT_QUOTES); ?> то она так и выводится в форме, когда <?php echo htmlspecialchars($_POST['first'], ENT_QUOTES); ?> - то выводится notice, ведь в обоих случаях должен быть notice . А вот проблема с вводом в форму какого-либо кода осталась. Когда я ввожу <script language="javascript" type="text/javascript"> alert("awfawfa"); </script>, то он при обработке не выводится. И кстати интересен еще 1 момент, если я убираю htmlspecialchars($_POST['first'], ENT_QUOTES) из кода, то сообщение в браузере "awfawfa" не появляется. А ведь должно?
Резюмирую:
1. Почему <?php echo ?> и <?= ?> работают по-разному?
2. Почему не выводится <script language="javascript" type="text/javascript"> alert("awfawfa"); </script>?
3. Почему не выводится awfawfa в alert, если убрать htmlspecialchars()?

  Ответить  
 
 автор: cheops   (24.08.2011 в 12:45)   письмо автору
 
   для: FallenAngel   (24.08.2011 в 12:38)
 

>1. Почему <?php echo ?> и <?= ?> работают по-разному?
За работу коротких тэгов <?= и ?> несет ответственность директива short_open_tag конфигурационного файла php.ini. В последних версиях PHP она по умолчанию отключена (раньше было наоборот).
short_open_tag = On

  Ответить  
 
 автор: FallenAngel   (24.08.2011 в 12:56)   письмо автору
 
   для: cheops   (24.08.2011 в 12:45)
 

спасибо!!! ВКЛ - заработало:)

  Ответить  
 
 автор: cheops   (24.08.2011 в 12:50)   письмо автору
 
   для: FallenAngel   (24.08.2011 в 12:38)
 

2. Содержимое тэга <script> не выводится, для того, чтобы его увидеть нужно посмотреть исходный код страницы (в разных браузерах это делается по-разному, но этот пункт обязательно должен быть в контекстном меню, вызываемом правой кнопкой мыши).
3. Вероятно у вас включен режим "магических кавычек", посмотрите исходный код, если там, что вроде этого - так оно и есть (он нарушает работу JavaScript).
<script language=\"javascript\" type=\"text/javascript\"> alert(\"awfawfa\"); </script>
Режим "магических кавычек" управляется директивой magic_quotes_gpc конфигурационного файла php.ini, где-то он включен, где-то он выключен, но в ближайших версиях PHP этот режим будет исключен, так как приносит больше проблем, чем решает.
magic_quotes_gpc = On

  Ответить  
 
 автор: FallenAngel   (24.08.2011 в 13:08)   письмо автору
 
   для: cheops   (24.08.2011 в 12:50)
 

2. Действительно, в исходном коде присутствует <script language="javascript" type="text/javascript"> alert("awfawfa"); </script> , но ведь htmlspecialchars() должен преобразовать <script></script> и сделать его видимым в браузере(также ссылаюсь на рис.9.2 и рис.9.3, стр. 259 и 260 соответственно "PHP5/6 в подлиннике", где тэг <script></script> выводится). Даже если я ввожу выдуманный <sefsefsefesf> он также не выводится в окне браузера (хотя также есть в исходном коде).
3. Посмотрел директиву - она в режиме off. В исходном коде <script language=\"javascript\" type=\"text/javascript\"> alert(\"awfawfa\"); </script> нет , а есть <script language="javascript" type="text/javascript"> alert("awfawfa"); </script>

  Ответить  
 
 автор: FallenAngel   (24.08.2011 в 13:17)   письмо автору
 
   для: FallenAngel   (24.08.2011 в 13:08)
 

Ха, попробовал в IE(ранее работал с Google Chrome), там п. 3 работает - выводится awfawfa (как без использования htmlspecialchars так и с использованием) в окне сообщения, а вот п.2 без изменений

<?php 
  
// Выставляем уровень обработки ошибок  
  // (http://www.softtime.ru/info/articlephp.php?id_article=23) 
  
error_reporting(E_ALL & ~E_NOTICE);  

  
$error = array(); 
  if (!empty(
$_POST)) 
  { 
    if(empty(
$_POST['first'])) $error[] = "текстовое поле не заполнено"
    if(empty(
$error)) 
    { 
      echo 
$_POST['first']; 
      exit(); 
    } 
  } 
  if(!empty(
$error)) 
  { 
    foreach(
$error as $err
    { 
      echo 
"<span style=\"color:red\">$err</span><br>"
    } 
  } 
?> 
<form method="post"> 
<input type="text" name="first" value="<?php echo htmlspecialchars($_POST['first'], ENT_QUOTES); ?>"> 
<input type="submit" value="Отправить"> 
</form>

  Ответить  
 
 автор: cheops   (24.08.2011 в 14:05)   письмо автору
 
   для: FallenAngel   (24.08.2011 в 13:08)
 

Видимым, но не рабочим код станет если строку
echo $_POST['first']; 
заменить на
echo htmlspecialchars($_POST['first']); 

  Ответить  
 
 автор: FallenAngel   (24.08.2011 в 14:20)   письмо автору
 
   для: cheops   (24.08.2011 в 14:05)
 

А как можно объяснить тот факт, что в ИЕ яваскриптовый код рабочий, а уже в гугле нет?(когда htmlspecialchars отсутствует)

  Ответить  
 
 автор: cheops   (25.08.2011 в 10:35)   письмо автору
 
   для: FallenAngel   (24.08.2011 в 14:20)
 

На самом деле то, что мы называем JavaScript отличается от браузера к браузеру. В IE на самом деле используется вариант Microsoft, который даже называется по другому - JScript. Он более лоялен к синтаксису... например, в нем можно опускать двоеточия, еще чего-то он пропускает и обрабатывает корректно... В других браузерах стоит классический JavaScript, который не реализует фич Microsoft.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования