|
|
|
| Здравствуйте!
Ура, почти доделала форму! Осталось чуть чуть, но без вашей помощи не справлюсь! Это большая 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 не залить. Это мой первый опыт “преобразовавния статического сайта”. | |
|
|
|
|
|
|
|
для: 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>';
}
|
| |
|
|
|
|
|
|
|
для: confirm
(17.10.2013 в 19:55)
| | Добрый вечер, Сonfirm,
спасибо за подсказки. Скрипт JS для прверки Select Multiple очень меня выручил, я его уже приспособила к делу:)
Что касается PHP проверки, я не совсем поняла, зачем надо городить такой огород из дополнительных проверок. Если пользователю предлагается список Select Multiple, он может либо выбрать, из того, что в списке, либо вообще ничего не выбирать. Никих посторонних данных он внести не может. Если он ничего не выберет, то функция Empty возвратит true на предмет того, что массив пустой. Так же я не проверяю радио кнопки и флажки в форме.
Но те поля формы, куда пользователь пишет свой текст, я конечно проверяю по полной программе.
Насчет пробелов я тоже не совсем поняла, но на всякий случай в PHP и в JS скриптах убрала все пустые строчки и все пробелы в начале строк. Кое-как повысила читаемость за счет строчек комментариев. Это касается HTML скриптов тоже? Ну уж это я переделывать не буду, у меня сайт из 50 страниц. | |
|
|
|
|
|
|
|
для: danga
(18.10.2013 в 22:55)
| | >Если пользователю предлагается список Select Multiple, он может либо выбрать, из того, что в списке, либо вообще ничего не выбирать. Никих посторонних данных он внести не может. Если он ничего не выберет, то функция Empty возвратит true на предмет того, что массив пустой.
1. Я могу просто отключить JS и проверок на клиенте не будет.
2. Я могу сделать копию вашей страницы и запускать ее локально, при этом подделаю и referer, и все данные - и в список, и во все остальные поля вставлю свои.
3. А проделав п. 2, я могу вклеить в вашу страницу любую пакость, если вы считаете, что опасны только поля ввода, а список, значения радио/чекбоксов безопасны, и основываясь на этом где-то их выведите так, как вы значения списка выводили.
4. А есть еще cURL.
5. Пробелы до и после теста в опциях списка для HTML пустой звук, но каждый из них, это лишний байт зря закачанный пользователем. И если у вас такой стиль писать HTML код, с обильным форматированием за счет пробелов где непопадя, то можете посчитать сколько лишнего у вас на страницах. | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: 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']
//что произойдет?
|
Нужно экранировать полученные от пользователя значения перед занесением их в базу, или как параметры запроса к базе, приводить к их к ожидаемому типу, и обезопасить их вывод на страницу, иначе взломают вас, как орех грецкий расколют. Это не означает, что нужно боятся всего и вся, нужно просто помнить о вопросах безопасности, тем более выполнять элементарные правила. | |
|
|
|
|