2013-07-22 3 views
0

У меня есть форма поиска на веб-странице, на которой я создам динамическую страницу из содержащегося в ней контента. У меня есть это, чтобы работать, но есть еще одна из этих форм, и есть также доступные данные. Я хочу, чтобы он отображал только скрытые поля полей, когда установлены sku, sku2, txtKeyword2. Ниже вы найдете то, что я пробовал до сих пор.Если полученное значение isset, поле ввода эха

<form name="frmSearch" method="get" action="<?=$_SERVER['SCRIPT_NAME']?>"> 
    <table width="100%"> 
    <tr> 
     <th><h3>Search </h3> 
      <div class="alert-box">Insert Text for alert box</div> 
     <input name="txtKeyword" type="text" id="txtKeyword" value="<?=$_GET["txtKeyword"];?>" size="40"> 
     <?php if(isset($_GET['sku'])) echo '<input type="hidden" name="sku" value="'.$_GET['sku'].'">'?> 
     <?php if(isset($_GET['sku2'])) echo '<input type="hidden" name="sku2" value="'.$_GET['sku2'].'">'?> 
     <?php if(isset($_GET['txtKeyword2'])) echo '<input type="hidden" name="txtKeyword2" value="'.$_GET['txtKeyword2'].'">'?> 
     <input class="alert button" type="submit" value="Search"></th> 
    </tr> 
    </table> 
</form> 

Все, что я хочу, это не показывать строки ввода, если они не установлены. Я думаю, что делаю все правильно, но я не уверен, как я изучаю php.

Я также пробовал следующий код, который работал, но он выводил следующий URL-адрес.

index.php?txtKeyword=giro%25skyline&sku=%09%09<input+type%3D 

Я знаю, что это не должно произойти, но это делает мою страницу работу, но когда я Гото вводить данные, чтобы другой форме поиска добавляет часть входной линии, чтобы URL-адрес. Вот код, который я пробовал:

<form name="frmSearch" method="get" action="<?=$_SERVER['SCRIPT_NAME']?>"> 
    <table width="100%"> 
    <tr> 
     <th><h3>Search </h3> 
      <div class="alert-box">Insert text for the alert box</div> 
     <input name="txtKeyword" type="text" id="txtKeyword" value="<?=$_GET["txtKeyword"];?>" size="40"> 
     <input type="hidden" name="sku" value="<?php if(isset($_GET['sku'])) echo ''.$_GET['sku'].'">'?> 
     <input type="hidden" name="txtKeyword2" value="<?php if(isset($_GET['txtKeyword2'])) echo ''.$_GET['txtKeyword2'].'">'?> 
     <input type="hidden" name="sku2" value="<?php if(isset($_GET['sku2'])) echo ''.$_GET['sku2'].'">'?> 
     <input class="alert button" type="submit" value="Search"></th> 
    </tr> 
    </table> 
</form> 

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

Благодаря Райан

ответ

0
<?php echo isset($_GET['sku']) ? '<input type="hidden" name="sku" value="'.$_GET['sku'].'">' : ''; ?> 

Однако, просто FYI, что не является безопасным на всех.

Для начала есть 2 вероятные уязвимости в пределах этого кода:

  1. XSS: если $_GET['sku'] что-то вроде: "><script>alert('XSS');</script> тогда вы получите окно с предупреждением на странице, которые теоретически могут быть использованы для фишинга, кражи cookie, создания червя (например, SamiWorm). Хороший способ исправить/предотвратить это - использовать htmlentities, который кодирует все html-символы в ассоциированные объекты.

  2. SQL Injection: если $_GET['sku'] что-то вроде ' UNION ALL SELECT id,username,password FROM users LIMIT 0,1-- тогда вы могли бы потенциально украли вашу базу данных (особенно если кто-то решил использовать такой инструмент, как SQLMap, который представляет собой автоматический инструмент для инъекций SQL). Хороший способ исправить это - использовать mysql_real_escape_string() в аргументе, который избегает любых запрещенных символов.

Так лучше было бы что-то вроде этого:

<?php echo isset($_GET['sku']) ? '<input type="hidden" name="sku" value="'.htmlentities(mysql_real_escape_string($_GET['sku'])).'">' : ''; ?> 

Вот почему ваш код не работает:

  1. Вы пытались сделать PHP оценить ваше закрытие html tag: "> внутри вашего php-эха не будет работать, поскольку он не будет знать, как его разобрать.

  2. Более простые в использовании тернарные операторы по сравнению с short-ifs as, imho, их легче читать и писать для всех остальных.

Вот моя полная версия:

<form name="frmSearch" method="get" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>"> 
    <table width="100%"> 
    <tr> 
     <th><h3>Search </h3> 
     <div class="alert-box">Insert text for the alert box</div> 
     <input name="txtKeyword" type="text" id="txtKeyword" value="<?php echo isset($_GET["txtKeyword"]) ? htmlentities(mysql_real_escape_string($_GET["txtKeyword"]))) : ''; ?>" size="40"> 
     <input type="hidden" name="sku" value="<?php echo isset($_GET['sku']) ? htmlentities(mysql_real_escape_string($_GET['sku'])) : ''; ?> "> 
     <input type="hidden" name="txtKeyword2" value="<?php echo isset($_GET['txtKeyword2'])) ? htmlentities(mysql_real_escape_string($_GET['txtKeyword2'])); ?>"> 
     <input type="hidden" name="sku2" value="<?php echo isset($_GET['sku2']) ? htmlentities(mysql_real_escape_string($_GET['sku2'])); ?> "> 
     <input class="alert button" type="submit" value="Search"></th> 
    </tr> 
    </table> 
</form> 
+0

Привет @DarkMantis Это работало, я знаю о SQL Injection, но это не будет использоваться кем-то другим, чем мой сам, и если мы собирались выпустить мы будем защищать наш dba –

+0

Хорошо, я исправил свой ответ @Prix. Я написал это в некоторой спешке, поэтому я не включил причины, но вы правы, это не оправдание :) – DarkMantis

+0

@RyanThomasKing как побочная заметка, у вашего php, похоже, есть short_open_tag = Off, который не позвольте вам использовать ' 'вместо этого. – Prix

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