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

HTML+CSS+JavaScript

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

 

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

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

тема: обработка Select Multiple в JavaScript
 
 автор: danga   (17.10.2013 в 18:16)   письмо автору
 
 

Здравствуйте!
Ура, почти доделала форму! Осталось чуть чуть, но без вашей помощи не справлюсь! Это большая HTML форма, которую пользователь заполняет при регистрации. Я ее проверяю в PHP и JavaScript на предмет того, все ли поля заполнены и корректно ли введены данные. Все работает, кроме того, что я не знаю как определить в JavaScript, если пользователь не сделал выбор в списке c SELECT MULTIPLE. Никак не могу найти инфу по поводу того, как JavaScript это проверяет.
Привожу фрагмент формы, который надо проверить

<HTML>
<head>
<script type="text/javascript" src="script.js"></script>
</head>
<body>
<form form name="aupairform" method="post" onsubmit="return validate()" action=="script.php">
<select multiple name="hostcountry[]" size="4">
<option value="Austrilia"> Australia </option>
<option value="Austria"> Austria </option>
<option value="Belgium"> Belgium </option>
<option value="Canada"> Canada </option>
<option value="Denmark"> Denmark </option>
<option value="Finland"> Finland </option>
</select>
<input type="submit" name="OK" value="submit" >
<input type="reset" value="reset">
</form>
</body>
</html>

script.php // работает
<?php
if (isset($_POST["OK"])){
if (empty($_POST["hostcountry"])) {
echo "*Host countries are not completed";
}
else {
$hostcountry = $_POST["hostcountry"];
foreach ($_POST['fluentlang'] as $keys=>$values) echo "<b>$values</b><br>";
}
}
?>

script.js // черновик

function validate()
{
var hoscounry=document.forms["aupairform"].hostcountry[0] // наверное, ошибка
// если массив hostcountry пустой, то
alert ("*Host countries are not completed")
return false;

else {
for (var i = 0; i <hostcountry.length; i++)
alert(hostcountry [i].value);
}
}

Пожалуйста, помогите написать этот скрипт, а то без него мне форму на ftp не залить. Это мой первый опыт “преобразовавния статического сайта”.

  Ответить  
 
 автор: confirm   (17.10.2013 в 19:55)   письмо автору
 
   для: danga   (17.10.2013 в 18:16)
 

Выставляя код на странице, обрамляйте его тегом code, иначе читать код трудно, а следовательно и отвечать ...

1. Передавайте в функцию обработки формы при отправке ссылку на саму форму - this, если в обработчике будет проверятся различные ее поля, или сразу ссылку на обрабатываемый элемент - this.element_name, если обрабатываться будет только этот элемент.

function validate(f) {
    //f - это форма, которая передана в обработчик ссылкой this в событии onsubmit 
    var opt = f.elements['hostcountry[]'].options, //это элементы списка, имя списка как индекс в кавычках 
                                                   //из-за наличия в нем квадратных скобок, иначе будет глюк  
        sel = false; //признак выбрана опция списка или нет
    
    //если хотя бы одна опция выбрана, то устанавливаем признак
    for(k in opt) if(opt[k].selected) sel = true;
     
    alert(sel ? "Выбрано" : "Не выбрано") //показываем результат
    return sel; //отправка/запрет отправки формы в зависимости от результата проверки
}

<form method="post" onsubmit="return validate(this)">
  <select multiple="" name="hostcountry[]" size="4">
    <option value="1">Australia</option>
    <option value="2">Austria</option>
    <option value="3">Belgium</option>
    <option value="4">Canada</option> 
    <option value="5">Denmark</option> 
    <option value="6">Finland</option>
   </select>
   <input type="submit" value="Send" />
</form>


2. Иметь значениями опций текст конечно можно, но крайне неудобно, тем более, что списки зачастую принадлежат многим субъектам описанным в базе.

3. Писать пробелы перед и до текста в опциях конечно легче для чтения, но лишний груз для передачи пользователю.

PS. Так тоже нельзя:

<?php 
if (isset($_POST["OK"])){
    if (empty(
$_POST["hostcountry"])) {
        echo 
"*Host countries are not completed";
    } else {
        
$hostcountry $_POST["hostcountry"];
        foreach (
$_POST['fluentlang'] as $keys=>$values) echo "<b>$values</b><br>";
    }
}


Во-первых empty($_POST["hostcountry"]) еще не значит, что он не empty, в смысле в нем то, что мы ожидаем. Все что приходит от пользователя требует проверки - проверка на клиенте для проформы. Сначала надо выяснить не содержит ли массив пустых элементов, и если они есть удалить их. И только после этого проверять пуст ли массив, для чего не обязательно писать if (empty($_POST["hostcountry"])) , можно проще - if(($_POST["hostcountry"]) . Все вместе это так:

<?
if($arr array_diff(array_map('trim'$_POST["hostcountry"]), array('')) {
    
//массив не пуст, но можно проверить все ли его элементы на месте, если требуется
    //если просто вывести массив полученный, то обязательно через htmlspecialchars,
    //если его значения строки, или intval, если значения числа,
    //а весь вывод это:
   
echo '<b>'.implode('</b><br>'array_map('htmlspecialchars'$arr)).'</b>';       
}

  Ответить  
 
 автор: danga   (18.10.2013 в 22:55)   письмо автору
 
   для: confirm   (17.10.2013 в 19:55)
 

Добрый вечер, Сonfirm,

спасибо за подсказки. Скрипт JS для прверки Select Multiple очень меня выручил, я его уже приспособила к делу:)

Что касается PHP проверки, я не совсем поняла, зачем надо городить такой огород из дополнительных проверок. Если пользователю предлагается список Select Multiple, он может либо выбрать, из того, что в списке, либо вообще ничего не выбирать. Никих посторонних данных он внести не может. Если он ничего не выберет, то функция Empty возвратит true на предмет того, что массив пустой. Так же я не проверяю радио кнопки и флажки в форме.
Но те поля формы, куда пользователь пишет свой текст, я конечно проверяю по полной программе.
Насчет пробелов я тоже не совсем поняла, но на всякий случай в PHP и в JS скриптах убрала все пустые строчки и все пробелы в начале строк. Кое-как повысила читаемость за счет строчек комментариев. Это касается HTML скриптов тоже? Ну уж это я переделывать не буду, у меня сайт из 50 страниц.

  Ответить  
 
 автор: confirm   (18.10.2013 в 23:14)   письмо автору
 
   для: danga   (18.10.2013 в 22:55)
 

>Если пользователю предлагается список Select Multiple, он может либо выбрать, из того, что в списке, либо вообще ничего не выбирать. Никих посторонних данных он внести не может. Если он ничего не выберет, то функция Empty возвратит true на предмет того, что массив пустой.

1. Я могу просто отключить JS и проверок на клиенте не будет.

2. Я могу сделать копию вашей страницы и запускать ее локально, при этом подделаю и referer, и все данные - и в список, и во все остальные поля вставлю свои.

3. А проделав п. 2, я могу вклеить в вашу страницу любую пакость, если вы считаете, что опасны только поля ввода, а список, значения радио/чекбоксов безопасны, и основываясь на этом где-то их выведите так, как вы значения списка выводили.

4. А есть еще cURL.

5. Пробелы до и после теста в опциях списка для HTML пустой звук, но каждый из них, это лишний байт зря закачанный пользователем. И если у вас такой стиль писать HTML код, с обильным форматированием за счет пробелов где непопадя, то можете посчитать сколько лишнего у вас на страницах.

  Ответить  
 
 автор: danga   (19.10.2013 в 12:49)   письмо автору
 
   для: confirm   (18.10.2013 в 23:14)
 

Здравствуйте, Confirm
Спасибо большое за ответ, про пробелы все поняла, постараюсь теперь этим не злоупотреблять. Очень полезная для меня инфа, я об этом даже и не задумывалась раньше.
С безопасностью я не совсем разобралась, но что-то мне стало не по себе. С одной стороны, неприятно, что кто-то может воспользоваться твоим незнанием, а с другой стороны, бесполезными делами тоже не хочется заниматься.
Конечно, я понимаю, что JS можно отключить и поэтому алгоритм проверки копирую в скрипте PHP. Поля login, password, name, surname,email, telephone, address, letter...куда пользователь вводит свою инфу, я проверяю так:
- можно ввети только разрешенные символы ( например, латинские буквы, цифры и пробелы). Ввод поверяю через сравнение с регулярными выражениями.
- при проверке каждого поля удаляю возможные вредные символы (на всякий случай, хотя не совсем понимаю, как они могут быть введены пользователем).
получается так:
]
if (empty($_POST["login"])) {
$err .= "*Login is not completed. <br>";
}
else {
$login =  $_POST["login"];
$login = stripslashes($login);
$login = html_entity_decode($login);
$login = strip_tags($login);
if(!preg_match("/^([A-Za-z0-9]+)$/", $login) || strlen($login)<5) {
$err .= "*Login is not valid. <br>";
$login = "";
}
echo "Login:", $login, "<br/>";
}  

- а в начале PHP скрипта я тоже ставлю проверку на безопасность (если честно, я это у кого-то списала:).

$rgAllowedProcess=array("smbd", "nmbd", "httpd");
$rgResult=array();
$processName=$_POST['processName'];
if(in_array($processName, $rgAllowedProcess))
{
   exec("ps aux | grep ".$processName, $rgResult);
   foreach($rgResult as $value)
   {
      echo($value."<br>\n");
   }


Больше я ничего для безопасности не делаю. Этого достаточно?
А можно ли защититься от копирования кода?
С уважением
danga

  Ответить  
 
 автор: confirm   (19.10.2013 в 16:33)   письмо автору
 
   для: danga   (19.10.2013 в 12:49)
 

Это текст      с более чем одни пробелом между словами в предложении
и с переводом строки. Если этот текст предписано выводить так как есть,
поместив его, например в тег <pre>, то он будет выведен так, как был набран.


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

Идеальная html-страница, это одна строка текста, в которой убраны пробелы и прочие символы не отображаемые на странице (сюда же относятся пользовательские комментарии). Пробел может служить причиной "неадекватного" поведения элементов на странице, например, в появлении отступов между элементами со стилем display: inline-block. Самое простое решение такой проблемы, это убрать пробелы межу тегами этих элементов.

В подключаемых файлах стилей, скриптов, необходимо также убирать лишнее, то есть было:

body {
    font: 62.5% Arial, Verdana, Geneva, sans-serif;
    width: 100%;
    height: 100%;
    margin: 0;
    padding: 0;
    background-color: #fdfdfd;
    color: #000;
}


а на вывод:

body{font:62.5% Arial,Verdana,Geneva,sans-serif;width:100%;height:100%;margin:0;padding:0;background-color:#fdfdfd;color:#000}


Скрипты кроме этого еще сжимают (обфускация), было:

function validate(f) {
    //f - это форма, которая передана в обработчик ссылкой this в событии onsubmit
    var opt = f.elements['hostcountry[]'].options, //это элементы списка, имя списка как индекс в кавычках
    //из-за наличия в нем квадратных скобок, иначе будет глюк
    sel = false; //признак выбрана опция списка или нет

    //если хотя бы одна опция выбрана, то устанавливаем признак
    for(k in opt) if(opt[k].selected) sel = true;

    alert(sel ? "Выбрано" : "Не выбрано") //показываем результат
    return sel; //отправка/запрет отправки формы в зависимости от результата проверки
}


стало для вывода:

function validate(a){a=a.elements["hostcountry[]"].options;var b=!1;for(k in a)a[k].selected&&b=!0);alert(b?"\u0412\u044b\u0431\u0440\u0430\u043d\u043e":"\u041d\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043e");return b};


Скопировать можно только клиентский код, и если имеется ввиду JS, то в сжатом коде, да еще со специальными вставками путающими логику его работы, быстро разобраться не получится. Это если с точки зрения чтобы "не копались". Но для того чтобы навредить копаться в нем необходимости и нет.

Кроме паролей, логинов, телефонов, пользователь может вводить и другую информацию, выбирать флажки, списки. Если считать первые три опасными, а остальное безопасным, и делать так как вы выводили значения своего списка на страницу (это может быть только ваша проверка работоспособности ваша кода, но не дай бог для действительно отображения выбранного или подключения в коде), то пожалуйста:

//например, ваш список
<select name="list">
    <option value="Text">Текст</option>
</select>

//я подменю на такой
<select name="list">
    <option value="<script>alert("Привет")</script>">Текст</option>
</select>

//и вы получив его вывели
<?
echo $_POST['list']
//что произойдет? 


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

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

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