Проверяю полученные данные:
if (empty($_POST['login']))
{
$is_error = 1;
$er_login_e = 'Вы не ввели логин.';
}
else
{
$user_login = trim($_POST['login']);
$user_login = htmlspecialchars($user_login);
if (strlen($user_login)<=5)
{
$is_error = 1;
$er_login_l = 'Логин не может быть менее шести символов.';
}
if(!preg_match("/^[a-zA-Z0-9]+$/", $user_login))
{
$is_error = 1;
$error_login = 'Логин может содержать только латинские буквы и числа.';
}
}
Данные не удовлетворяют нашим условиям и $is_error = 1. При таком раскладе, вновь выводится поле для ввода логина.
<input style="width:500px; height:25px; border: solid 1px RGB(208,215,226);
font-family:Verdana,Arial; font-size:15px;
background:RGB(250,250,250);" type="text" maxlength="20"
name="login" value="<?php echo stripslashes($_POST['login']); ?>" \>
Вот тут самое интересное. В поле логина остается значение log, все после двойной кавычки удаляется.
Спустя 27 минут, 16 секунд (26.08.2010 - 09:45) Romms написал(а):
IamSmorodin, всё просто...
введи вместо логина:
введи вместо логина:
log" onload="alert('XSS!!!');"
Цитата |
<?php echo stripslashes($_POST['login']); ?> |
убери функцию stripslashes()
Спустя 12 минут, 55 секунд (26.08.2010 - 09:58) IamSmorodin написал(а):
Цитата (Romms @ 26.08.2010 - 09:45) |
IamSmorodin, всё просто... введи вместо логина: log" onload="alert('XSS!!!');" |
У меня ограничение на количество символов. Не помещается.
А как мне убрать экранирование кавыяек, если убрать stripslashes?
P.S. Вот ТУТ можно поэксперементировать
Спустя 12 минут, 29 секунд (26.08.2010 - 10:10) Romms написал(а):
Цитата |
У меня ограничение на количество символов. Не помещается. |
ну тогда
" onclick="alert(1)
*то что у вас стоит maxlength="20" легко обойти!!! Даже простым нажатиям клавиш Ctrl+U в Опере(только за эту стандартную фичу уважаю Оперу...)))
и тогда можно вставить, и такое, и даже круче)
" onclick="alert(document.cookie)
Цитата |
А как мне убрать экранирование кавыяек, если убрать stripslashes? |
А зачем вам их убирать?!!
Спустя 6 минут, 34 секунды (26.08.2010 - 10:17) IamSmorodin написал(а):
Цитата |
То что у вас стоит maxlength="20" легко обойти!!! Даже простым нажатиям клавиш Ctrl+U в Опере(только за эту стандартную фичу уважаю Оперу...))) и тогда можно вставить, и такое, и даже круче) |
Тогда я обрежу все, что стоит за 20-м символом.
Цитата |
А зачем вам их убирать?!! |
Просто, если ввести login' -> то в поле появится login\'
Спустя 24 минуты, 42 секунды (26.08.2010 - 10:42) Romms написал(а):
Вот эта строка
делает так:
$user_login = htmlspecialchars($user_login);
делает так:
Цитата |
\n - " - "e; & - & |
Понимаш?
Цитата |
Тогда я обрежу все, что стоит за 20-м символом. laugh.gif |
тогда я впихну тот самый код только в 20символов ,обрезка - это не метод!
Почитай http://php.net/manual/en/function.htmlspecialchars.php
Спустя 2 минуты, 30 секунд (26.08.2010 - 10:44) IamSmorodin написал(а):
Romms
Понял Спасибо за литературу, почитаю...
Я так понял мне хватит регулярного выражения, чтобы проверить правильность ввода, так?
И все-так отчего исчезает все после двойных кавычек?
Понял Спасибо за литературу, почитаю...
Я так понял мне хватит регулярного выражения, чтобы проверить правильность ввода, так?
И все-так отчего исчезает все после двойных кавычек?
Спустя 10 минут, 42 секунды (26.08.2010 - 10:55) Romms написал(а):
Цитата |
И все-так отчего исчезает все после двойных кавычек? dry.gif |
Блин... да потому что ты закрываишь этой лапкой параметр ВАЛУЕ!!! Посмотри исходный код, там будет всё что ты вписал!! только оно уже не значения поля а почти что параметры тега!
если ты вписал log" onclick="alert(1)
то в исходном коде будет написано
Цитата |
<input style="width:500px; height:25px; border: solid 1px RGB(208,215,226); font-family:Verdana,Arial; font-size:15px; background:RGB(250,250,250);" type="text" maxlength="20" name="login" value="log" onclick="alert(1)" \> |
Спустя 6 минут, 50 секунд (26.08.2010 - 11:02) Romms написал(а):
Цитата |
Я так понял мне хватит регулярного выражения, чтобы проверить правильность ввода, так? |
Для проверки, да(ну кроме проверки длины)
Но не забывай экранировать все спец символы MySQL функцией mysql_real_escape_string() и при выводе из базы "прогонять" через htmlspecialchars()
Спустя 40 минут, 3 секунды (26.08.2010 - 11:42) IamSmorodin написал(а):
Цитата (Romms @ 26.08.2010 - 11:02) | ||
Для проверки, да(ну кроме проверки длины) Но не забывай экранировать все спец символы MySQL функцией mysql_real_escape_string() и при выводе из базы "прогонять" через htmlspecialchars() |
Понял наконец-то. То, что я в value хочу подставить превращается в теги
При записи базы экранирую. Пока еще ничего не вывожу То есть, если я буду проверять длину, как у себя в коде, то мне не страшны твои напасти с подстановкой кода?
Спустя 52 минуты, 4 секунды (26.08.2010 - 12:34) Romms написал(а):
Цитата |
То есть, если я буду проверять длину, как у себя в коде, то мне не страшны твои напасти с подстановкой кода? |
Риск уменшается, но самые хитрые хацкеры и в 20символов впихнуть вредоносный код!
По этому и пользуйся htmlspecialchars() при выводе данных с таблицы
Спустя 19 минут, 36 секунд (26.08.2010 - 12:54) DedMorozzz написал(а):
Ненадо писать ХСС атака после кавычек. Большая часть буржуйско-вражеских имён идут с кавычкой. И на укр. Моё отчество с кавычкой(апострофом) пишется.
Юзай ХТМЛСПЕШ.. и собсно всё.
Юзай ХТМЛСПЕШ.. и собсно всё.
Спустя 8 минут, 38 секунд (26.08.2010 - 13:02) IamSmorodin написал(а):
А как мне все это дело нормально передать в value, когда я подставляю эти значения в форму ввода... а то бьюсь, а ничего
Спустя 3 минуты, 1 секунда (26.08.2010 - 13:05) DedMorozzz написал(а):
Да господи, выводи через htmlspesialcharts. И не будут срабатывать. Все эти "хаки" расчитаны на то, что код будет работать. А ты его обезапасивай. Передавая инструкцию, что это не спец символы, а просто набор букавок.
_____________
Мой Twitter
Подписывайтесь :)