И снова новые задания! Пока 3 штуки добавил, потом еще напишу. Продолжаем решать задания) Присылайте так-же свои задания, с удовольствием добавлю.
Есть такая форма загрузки картинок на сайт (например в админке, куда вы только что получили доступ через sql-inj): PHP: <?php if ($HTTP_POST_VARS['submit']) { if (!is_uploaded_file($HTTP_POST_FILES['file']['tmp_name'])) { $error = "You did not upload a file!"; unlink($HTTP_POST_FILES['file']['tmp_name']); // assign error message, remove uploaded file, redisplay form. } else { //a file was uploaded $maxfilesize=10240; if ($HTTP_POST_FILES['file']['size'] > $maxfilesize) { $error = "file is too large"; unlink($HTTP_POST_FILES['file']['tmp_name']); // assign error message, remove uploaded file, redisplay form. } else { if ($HTTP_POST_FILES['file']['type'] != "image/gif" AND $HTTP_POST_FILES['file']['type'] != "image/jpeg") { $error = "This file type is not allowed"; unlink($HTTP_POST_FILES['file']['tmp_name']); // assign error message, remove uploaded file, redisplay form. } else { //File has passed all validation, copy it to the final destination and remove the temporary file: copy($HTTP_POST_FILES['file']['tmp_name'],"./".$HTTP_POST_FILES['file']['name']); unlink($HTTP_POST_FILES['file']['tmp_name']); print "File has been successfully uploaded!"; exit; } } } } ?> <html> <head></head> <bоdу> <form action="<?=$PHP_SELF?>" method="post" enctype="multipart/form-data"> <?=$error?> <br><br> Choose a file to upload:<br> <input type="file" name="file"><br> <input type="submit" name="submit" value="submit"> </form> </bоdу> </html> URL до скрипта загрузки: http://site.ru/admin/upload.php (просто как пример) Задача: Написать скрипт на PHP, загружающий шелл вместо картинки, обойти проверку (т.е. загрузить файл с расширением .php) Условия: magic_quotes_gpc=ON, register_globals=OFF Форма заливки взята с реально действующего движка. Цветным просьба не участвовать, т.к. легко
Задание 030 PHP: <?php $a = array('cat','dog','fox'); $b = array('Moscow','London'); $c = array('RED'); $d = $b + $a + $c; ?> в результате мы получим массив : Array ( [0] => Moscow [1] => London [2] => fox ) результат таков потому что у массивов $a,$b,$c есть совпадения в индексах(остались только разные индексы). Code: $a имели индексы 0, 1, 2. $b - 0, 1. $c - 0. поскольку в сложении массив $b стоял первым то его елемнты есть в результирующем массиве $d ну и последний елемент массива $d [2] => fox остался потому что неодин из елементов 3-их массивов $a,$b,$c не имел индекс [2]
Задание 031 PHP: <?php function cnt_arr($array, &$count = 0) { foreach ($array as $value) { if (is_array($value)) { $count++; cnt_arr($value, $count); } else { return; } } } $arr = array('1' => array('2' => array('1' => '2'))); $cnt = ''; cnt_arr($arr, $cnt); echo($cnt); ?> 2 Pashkela А я бы просто через tamper data сменил Content-Type: text/plain на Content-Type: image/gif, но можно конечно и самому сформировать Кстати, из какой это cms?
Задание 032 PHP: <?php function countspec($stroka){ for($i=0;$i<=strlen($stroka);$i++){ if($stroka{$i}!==htmlspecialchars($stroka{$i})){ $count++; } } return $count; } $stroka='<a>'; echo countspec($stroka);//2 потому как < & > ?>
2 m0nsieur: Задача - написать фактически сплойт. Joker-jar только что в ЛС отписал рабочий вариант Что tamper data - ежу понятно, но тут раздел кодинг. Откуда по вашему сплойты на milw0rm.com берутся? Вот и польза будет Тот же сплойт на fckeditor на пыхе PS: Речь идет об автоматизации процесса
Не ахти имхо... без флага ENT_QUOTES htmlspecialchars() будет пропускать ОДИНАРНУЮ кавычку,да и вообще она мало спец символов преобразует.... с регуляркой будет правильней наверно...
PHP: <?php function countspec($stroka){ $count=0; for($i=0;$i<=strlen($stroka)-1;$i++){ if(!preg_match("/[a-zA-Z0-9]/",$stroka[$i])) {$count++;}} Echo ('Спец символов:'.$count); }?> Как то так.... Не злись... я просто выразил своё мнение)
И у того и у другого ошибка - достаточно просто написать $i<strlen($stroka) счет длины начинается с единички
Спасибо,исправил. PHP: <?php function countspec($stroka){ $count=0; for($i=0;$i<strlen($stroka);$i++){ if(!preg_match("/[a-zA-Z0-9]/",$stroka[$i])) {$count++;}} Echo ('Спец символов:'.$count); } ?>
круто! ,у тебя выйдет в слове ОМГ 3 спецсимвола. откуда ты взял что $stroka массив?ты её перед этим explod'ил? htmlspecialchars — Преобразует специальные символы в HTML сущности и по моему в данном примере её будет рациональней использовать
Эм можно в рег и русские буквы добавить.... А №%:?*' htmlspecialchars пропустит Насчёт массива возможно я не прав,я не кодер. По привычке представляю себе строку как массив char...
LIGA, PHP: <?php function countspec($stroka){ $count=0; for($i=0;$i<=strlen($stroka)-1;$i++){ if(!preg_match("/[a-zA-Z0-9]/",$stroka[$i])) {$count++;}} Echo ('Спец символов:'.$count); } ?> Надо вместо $stroka[$i] , ,$stroka{$i}
Можно и так и так. Пока что. В PHP6 можно только [$i]. Другое дело, что функция записывается проще: PHP: <?php function countspec($stroka) { echo 'Спецсимволов: '.preg_match_all('/[^a-zA-Z0-9]/',$stroka,$m); } ?> В регулярку добавьте символы, которые нужно.
Вот мой вариант этой задачки: PHP: <?php function countspec($stroka) { $count=0; for($i=0;$i<strlen($stroka);$i++) { if(!preg_match("#[\sa-zа-я0-9]#i",$stroka{$i})) $count++; } Echo ('Спец символов:'.$count); } countspec("Вася Пушкин Loloman !@#$%^&*()-+№"); ?> Пробел не спец символ по идее, его просто надо игнорировать, ну и большие буквы если просто модификатор i ставим и всё Но это опять же не учитывая возможных кириллических кодировок и прочих уникодов PS: Но самый красивый вариан конечно у d_x двумя постами выше, но с моей регуляркой + его ^ в начале, т.е. так: PHP: <?php function countspec($stroka) { echo 'Спецсимволов: '.preg_match_all('/[^\sa-zа-я0-9]/i',$stroka,$m); } countspec("Вася Пушкин Loloman !@#$%^&*()-+№"); ?>
Ради интереса сделал бенчмарк: PHP: <?php set_time_limit(0); //моя функция function countspec($stroka) { return preg_match_all('/[^a-zA-Zа-яА-ЯёЁ0-9 ]/',$stroka,$m); } //функция Pashkela function countspec2($stroka) { $count=0; for($i=0;$i<strlen($stroka);$i++) { if(!preg_match("#[\sa-zа-я0-9]#i",$stroka{$i})) $count++; } return $count; } //для бенчмарка function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } $m=microtime_float(); for($i=0;$i<500000;$i++) { countspec('вася пупкин !@#45 траляля'); } $tm=microtime_float()-$m; print 'd_x: '.$tm.' sec<br>'; $m=microtime_float(); for($i=0;$i<500000;$i++) { countspec2('вася пупкин !@#45 траляля'); } $tm=microtime_float()-$m; print 'Pashkela: '.$tm.' sec<br>'; ?> Результат: Code: d_x: 4.36448502541 sec Pashkela: 33.2198770046 sec Моя функция в 7.5 раз быстрее)
Задание 024 PHP: <?php function getmicrotime() #функция, засекающая время { $time = explode(" ", microtime()); return ($time[0] + $time[1]); } $time['first']['start'] = getmicrotime(); #время начала первого цикла for ($i = 0; $i < 10; $i++) { echo '1php '; } $time['first']['end'] = getmicrotime(); #время окончания первого цикла $i = 0; $time['second']['start'] = getmicrotime(); #время начала второго цикла while ($i < 10) { echo 'w1'; $i += 1; } $time['second']['end'] = getmicrotime(); #время окончания второго цикла $time['first']['difference'] = $time['first']['end'] - $time['first']['start']; #время работы первого цикла $time['second']['difference'] = $time['second']['end'] - $time['second']['start']; #время работы второго цикла $time['difference'] = $time['first']['difference'] - $time['second']['difference']; #разница во времени между циклами echo '<br>Первый скрипт: ' . $time['first']['difference'] . '<br>Второй скрипт: ' . $time['second']['difference'] . '<br>Разница: ' . $time['difference']; #выводим информацию ?> Code: Первый скрипт: 5.5074691772461E-5 Второй скрипт: 1.978874206543E-5 Разница: 3.5285949707031E-5
Задание 030 В результате слияния PHP: <?php $a = array('cat','dog','fox'); $b = array('Moscow','London'); $c = array('RED'); $d = $b + $a + $c; ?> мы получим следующий результат PHP: Array ( [0] => Moscow [1] => London [2] => fox ) Неожиданный результат, не правда ли? Скорее всего вы ожидали получить массив PHP: Array ( [0] => Moscow [1] => London [2] => cat [3] => dog [4] => fox [5] => RED ) Однако в PHP на этот счет свои правила. При слиятии массивов, в которых содержатся элементы с одинаковыми индексами (ключами), в результирующем массиве останется элемент первого массива. А в приведенном примере элементы массива b имели индексы - 0, 1; массива a - 0, 1, 2; массива c - 1. В итоге мы получили массив с тремя индексами: PHP: Array ( [0] => Moscow [1] => London [2] => fox )