Вверх ↑
Этот топик читают: Гость
Ответов: 327
Рейтинг: 5
#1: 2014-08-17 11:53:28 ЛС | профиль | цитата
Предлагаю сыграть в хакера, как ни странно правила все же присутствуют))
1.Просьба не губить сервер(отключка не нужна).
2.Всеми доступными способами добавить свой ник в неизвестное(по условию) поле. Все кто сможет добавить свой ник. будут отображены в списке победителей.
3.Просьба не чистить таблицу.

Вот обработчик, для лишнего интересу :
#php
<?
$replace_list1 = '! ~ ` \' , . ( ) * & ^ : ; % $ # @ " № ? = + - \\ / | ';
$replace_list2 = '! ~ ` \' . ( ) * & ^ : ; % $ # @ " № ? = + - \\ / | ';
$replace_list1 = explode(' ',$replace_list1);
$replace_list2 = explode(' ',$replace_list2);
$table_name = str_replace($replace_list1, '', $_POST['table_name']);
$col_names = str_replace($replace_list2, '', $_POST['col_name']);
$values = str_replace($replace_list2, '', $_POST['options']);
$values = explode(',', $values);
foreach($values as $val)
$vals = $vals.'\''.$val.'\',';
$vals = substr($vals,0,-1);
if($_POST['type'] == 'insert'){
mysql_query("INSERT INTO ".$table_name." (".$col_names.") VALUES (".$vals.")");
echo 'INSERT INTO '.$table_name.' ('.$col_names.') VALUES ('.$vals.')'.'<br>';
}
if($_POST['type'] == 'select'){
$sql = mysql_query("SELECT ".$col_names." FROM ".$table_name."");
echo 'SELECT '.$col_names.' FROM '.$table_name.''.'<br><br>';
echo '<table><tr><td>Имя</td><td>Комментарий</td></tr>';
while($result = mysql_fetch_assoc($sql))
echo '<tr><td>'.$result['name'].'</td><td>'.$result['comment'].'</td></tr>';
echo '</table><br><br>';
}
?>
Адрес : http://test-baza.hol.es/

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


P.S.
Делаю сайт, хочу избавиться от дыр, решил вот на такой игре поискать дыры.
Естественно на сайте нет подобной лабуды с абы каким добавлением в бд.
Так же интересно:
1.Является ли mysql_real_escape_string альтернативой
$replace_list1 = '! ~ ` \' , . ( ) * & ^ : ; % $ # @ " № ? = + - \\ / | ';"
$replace_list1 = explode(' ',$replace_list1);
$col_names = str_replace($replace_list2, '', $_POST['col_name']);
2.Как сделать по функционалу такой же обработчик, но проще.
карма: 0

0
Ответов: 498
Рейтинг: 39
#2: 2014-08-17 18:28:04 ЛС | профиль | цитата
1.
mysql_real_escape_string учитывает ещё кодировку соединения.
Зачем что-то придумать если уже всё есть?
Уже давно не рекомендуется использовать чистые функции mysql, используй pdo,mysqli или orm.
Там есть preparement statement, не знаю как верно переводятся, созданы избавится от проверки данных через функцию, вместо этого данные в запрос подставляются не склейкой, а заменой нудных значений на автоматически отфильтроные данные, тем самым ещё улучшая читаемость.
Примерно так выглядит
$q = CreateQuery:: ( 'SELECT * FROM test WHERE username = :username');
$q->username = $_POST['username'];
$q->execute();
2.
$replace_list1 = '!~`\',.()*&^:;%$#@"№?=+-\\/|';"
$replace_list1 = str_split($replace_list1);
$col_names = str_replace($replace_list2, '', $_POST['col_name']);


Без приза не интересно .
карма: 0

1
Голосовали:knoot0279
Ответов: 327
Рейтинг: 5
#3: 2014-08-17 19:58:11 ЛС | профиль | цитата
Muz-Tv писал(а):
Без приза не интересно

Не так уж я богат, чтобы везде призы выписывать

Muz-Tv, не поделишься как узнал поле?
карма: 0

0
Гость
Ответов: 17029
Рейтинг: 0
#4: 2014-08-17 19:59:06 правка | ЛС | профиль | цитата


Редактировалось 4 раз(а), последний 2021-05-21 06:02:18
карма: 0

0
Ответов: 327
Рейтинг: 5
#5: 2014-08-17 21:02:25 ЛС | профиль | цитата
как я понял есть смысл использовать PDO, но тут у меня возникла проблема... в скачанном денвере отсутствует php_pdo.dll
никак не могу найти этот файл
версия php 5.3.13
карма: 0

0
Ответов: 498
Рейтинг: 39
#6: 2014-08-17 21:18:16 ЛС | профиль | цитата
Denwer уже слишком стар, лучше http://open-server.ru/
или https://www.vagrantup.com/
Список колонок - пусто, значения - a,b,c,d обязательно 4 штуки.
карма: 0

0
Ответов: 327
Рейтинг: 5
#7: 2014-08-17 21:26:50 ЛС | профиль | цитата
Muz-Tv писал(а):
Список колонок - пусто

Тобиш я лоханулся на том, что не проверил на пустое значение получается...
Ну хоть очистить таблицу не получится при таком обработчике?
------------ Дoбавленo в 21.26:
Muz-Tv, а переход с денвера на open-server или vagrant не будет "болезненным"?
карма: 0

0
Ответов: 498
Рейтинг: 39
#8: 2014-08-17 21:36:08 ЛС | профиль | цитата
knoot0279, Могут быть и другие уязвимости. open-server почти как денвер, даже проще. vagrant сложнее, но создаёт вируалку с linux с php,mysql и тд, что позволяет легок ставить другие модули из репозитория linux.
карма: 0

0
Ответов: 327
Рейтинг: 5
#9: 2014-08-18 02:00:09 ЛС | профиль | цитата
Muz-Tv писал(а):
Могут быть и другие уязвимости

я не понимаю как можно еще что-то прикрутить туда(очистку например), неужели можно вкрутить очистку после замен из списка $replace_list
------------ Дoбавленo в 02.00:
Блин, где Vagrant создает папку с проектом? Задолбался уже искать. Написано в "~/.vagrant.d/", но я никак не пойму где это

карма: 0

0
Ответов: 4630
Рейтинг: 749
#10: 2014-08-18 11:08:58 ЛС | профиль | цитата
Более простые и удобные аналоги Denwer:
XAMPP
Vertrigo
карма: 26

0
Ответов: 327
Рейтинг: 5
#11: 2014-08-18 15:21:19 ЛС | профиль | цитата
Ребят, главное чтобы был php,mysqli,pdo, вроде ничего не забыл.
Ну и конечно чтобы не было проблем с переносом на хостинг, куда без этого.
карма: 0

0
Гость
Ответов: 17029
Рейтинг: 0
#12: 2014-08-18 15:47:21 правка | ЛС | профиль | цитата


Редактировалось 4 раз(а), последний 2021-05-21 06:02:18
карма: 0

0
Ответов: 327
Рейтинг: 5
#13: 2014-08-18 18:43:53 ЛС | профиль | цитата
Ладно, не важно, оказывается pdo там уже было и с версии пхп 5.3.0(вроде) уже вшито.
Я вот только одно понять не могу...
Почему
$query = mysql_query("SELECT *,INET_NTOA(ip) AS ip FROM user WHERE id = '".intval($_COOKIE['id'])."' LIMIT 1");
$userdata = mysql_fetch_assoc($query);
не безопасно, а
$id = intval($_COOKIE['id']);
$stm = $pdo->prepare("SELECT *,INET_NTOA(ip) AS ip FROM user WHERE id = ? LIMIT 1");
$stm->execute(array($id));
$userdata = $stm->fetch();
безопасно
карма: 0

0
Разработчик
Ответов: 4698
Рейтинг: 426
#14: 2014-08-18 19:22:49 ЛС | профиль | цитата
knoot0279 писал(а):
Почему

Потому что prepared statements для того и существуют, чтобы делать шаблон запроса, и потом просто подставлять в него данные в чистом виде, а при выполнении полученного запроса библиотека сама позаботится, чтобы каждый аргумент был проэкранирован и не смог повлиять на строку запроса.
карма: 10
0
Ответов: 327
Рейтинг: 5
#15: 2014-08-19 15:22:10 ЛС | профиль | цитата
И еще...
требуется получить данные из бд.
$id = intval($_COOKIE['id']);
$stm = $pdo->prepare("SELECT *,INET_NTOA(ip) AS ip FROM user WHERE id = ? LIMIT 1");
$stm->execute(array($id));
$userdata = $stm->fetch();
echo $userdata['login'];

как сократить такой запрос?

...раньше использовал
$res = mysql_fetch_assoc(mysql_query("SELECT *,INET_NTOA(ip) AS ip FROM user WHERE id = '".intval($_COOKIE['id'])."' LIMIT 1"));
echo $res['login'];
ведь гораздо компактнее, и хотелось бы сохранить эту компактность.
------------ Дoбавленo в 19.41:
Я вижу только один момент : $stm->execute(array(intval($_COOKIE['id'])));, неужели это все?
карма: 0

0
15
Сообщение
...
Прикрепленные файлы
(файлы не залиты)