Вопрос по безопасности (разрешение пользователю делать селект из базы, используя пере

BeatBox

Guest
Вопрос по безопасности (разрешение пользователю делать селект из базы, используя пере

Здравствуйте. у меня сеьезный вопрос:
на сайте есть раздел. например "статьи".
На главной странице раздела выводяться последние ХХ статей. У пользователя есть возможнлсть выбирать букву, и выбрав букву, отобразяться статьи на эту букву. (буква вводиться в отдельно поле в БД в таблице статей, при написании).
Примерно функция выглядит так:
PHP:
function show_article() {
  global $prefix, $db, $sort, $v;
<!--тут несклько проверок--!>

 if ($v == "") { $resultwhere =""; }
    if ($v ==! "") { $resultwhere ="WHERE verb='$v'"; }
  include("header.php");

$a = 1;
$resultre = $db->sql_query("SELECT a.pid as pid, UNIX_TIMESTAMP(a.date) as formatted, a.title as title, AVG(b.vote_mark) as vote_mark FROM ".$prefix."_pages as a LEFT JOIN ".$prefix."_vote as b on (a.game_id=b.vote_id) GROUP BY b.vote_mark $resultwhere ORDER BY $sortby $stype limit 0, 50");
Как видите -если в строке браузера написано просто
page.php?name=content то выведуться последние 50 статей.
а если page.php?name=content&v=a - то выведутся статьи, с полем в БД verb = a, тоесть на букву А.
Скажите пожалуйста - насколько я дыряво сделал? и как можно это исправить (если нужно). Может сделать проврку например "если бувка не равна (перечень букв) то $v = "";
Вообще я начинающий РНР-ламер:) Надеюсь на советы профи ;)
 

Gas

может по одной?
Не самый короткий вариант, но лучше чем ничего.
PHP:
$resultwhere = '';
if (isset($_GET['v']) && !empty($_GET['v'])) {
  $resultwhere = substr(preg_replace('~[^a-z]~i', '', $_GET['v']), 0, 1);
}
http://detail.phpclub.ru/
там есть раздел "Вопросы безопасности"
 

BeatBox

Guest
Gas
спасибо приогромнейшее. Ато блин запущу сайт и его грохнут моментально.
пс
Хотя я буду делать Rewrite для ссылок, поэтому по идее слоно будет узнать пути и адреса файлов.. но все же ;)
 

Gas

может по одной?
BeatBox
На код мой не смотри, главное это ссылка, почитай "вопросы безопасности", а там глядишь и не "грохнут моментально" ;)
 

BeatBox

Guest
Gas
Проверил Ваш код - неработает. Точнее работает не совсем верное. Например у меня кроме стандартных букв
(a,b,c) есть ещё два таких парметра 'num' & 'rus' - названия с цифт и названия русские. Можно както это втюхать в вышеизложенный код?
 

Gas

может по одной?
вместо [^a-z] поставь [^0-9a-zа-я]
но если с русскими не заработает тогда в поиск по *setlocale*
 

BeatBox

Guest
Gas
нет нет вы не поняли. в строке адреса нет русских букв. просто если написать
&v=rus то будут браться строки из таблицы где verb=rus.

Тоесть задача - разрешить выполнять команду только есть
v строго равно:
a, b, c, d, e ,f (и так далее, ТОЛЬКО В ОДНОМ виде, тоесть не 'zz' а только 'z') rus, num.

пс
Я так понял что код в теперешнем виде дырявый?
 

BeatBox

Guest
1. а как в Вашем коде разрешить не все a-z а все a-z но только в одном экземпляре?


2. В статье http://detail.phpclub.ru/article/2003-12-01 сказано что нужно вставить код:
PHP:
<?php 
$referer=getenv("HTTP_REFERER"); 
if (!ereg("^http://www.myserver.com")) { 
    echo "hacker? he-he...\n"; 
    exit; 
} 
?>
если я ставлю
PHP:
$referer=getenv("HTTP_REFERER"); 
if (!ereg("^http://www.ig.com")) { 
    echo "hacker? he-he...\n"; 
    exit;
то меня вечно за хакера держат, (http://www.ig.com - это у меня на локалке).
а вот если ставлю:
PHP:
$referer=getenv("HTTP_REFERER");
if (!ereg("page.php", $_SERVER['SCRIPT_NAME'])) {
    echo "hacker? he-he...\n";
    exit;
}
то работает. Я правильно сделал? или мой вариант ничего не оберегает?
 

BeatBox

Guest
Вот смотритЕ, кажеться у меня небольшой прогресс:
PHP:
        $resultwhere = '';
if (isset($_GET['v']) && !empty($_GET['v'])) {
   if (strlen($v) > 1) {
    if (($v !== "rus") && ($v !== "num")) {
Header("Location: page.php?name=content");
}
}
  $resultwhere = substr(preg_replace('~[^a-z]~i', '', $_GET['v']), 0, 1);
}
если &v !== букве (одной) то проверяем, вдруг это num или rus. если не то и не другое - шуруем на главную страницу раздела.
НОрмально? ;)

-~{}~ 11.03.05 21:34:

хм. непойму почему код пропускает значения &v=` и прочие символы. Что-то я не туда вставил, да?
 

Gas

может по одной?
ты так и пишешь
PHP:
$resultwhere = substr(preg_replace('~[^a-z]~i', '', $_GET['v']), 0, 1);
и больше ничего?
 

BeatBox

Guest
Gas честно говоря да, а что ещё нужно? (я неособо просто вьезжаю в эту строку, что она делает и как :) всего лишь нужно увеличить безопастность)
хотя ещё ниже есть проверка:

PHP:
if ($v == "") { $resultwhere =""; }
                if ($v ==! "") { $resultwhere ="WHERE active='1' AND verb='$v'"; }
-~{}~ 11.03.05 22:26:

Gas
Подскажете, что ещё я не дописал?
 

Gas

может по одной?
Эта строка заменяет всё кроме латинских символов и вырезает первую букву.

Тебе нужно добавить ещё проверку пустая ли она, если нет прилепить к ней WHERE active='1' AND verb=

-~{}~ 11.03.05 22:36:

что-то вроде
PHP:
$resultwhere = '';
if (isset($_GET['v']) && !empty($_GET['v'])) {
  if ($_GET['v'] == 'rus' || $_GET['v'] == 'num') {
    $resultwhere = $_GET['v'];
  } else {
    $resultwhere = substr(preg_replace('~[^a-z]~i', '', $_GET['v']), 0, 1);
  }
  if (!empty($resultwhere)) $resultwhere = "WHERE v='".$resultwhere."'";
}
 

BeatBox

Guest
Gas
последний вариант нерабочий (тоесть что-то там не то).
так что я оставил тот что был до этого.. как думаете нестрашшно что (даже если узнают путь, минуя как-то ReWrite) что юзер имеет возможность вместо буквы вставитьОДИН произвольный символ?

-~{}~ 11.03.05 23:30:

кстате вроде же есть какой-то код, что-то вроед "если $v неравно a-z то...". неподскажете, какой это код?
 

BeatBox

Guest
if ($v !== preg_match('[^a-z]')) {
Header("Location: page.php?name=content");
}
что-то неполучаеться. страница начала грузиться на 1 сек. дольше, а результата - ноль.
 

SelenIT

IT-лунатик :)
BeatBox

Синтаксис [m]preg_match[/m] и какое значение она возвращает - см. ссылку.

Hint: сравнивать нужно что-то с чем-то (т.е. аргументов как минимум 2) а результат - есть совпадение или нет (т.е. по идее - логическое значение).
 

BeatBox

Guest
SelenIT
пожалуйста сли не сложно -напишите как это будет в моем коде (тоесть если это не буква - то Header("Location: page.php?name=content");
я обязательно потом разберусь, но у меня цель - до утра запустить сайт. И кстате почему-то когда захожу по ссылке на php.net у меня русские символы все иероглифы (с кодировкой вроде все норма, даже проверил IE и FireFox. Навеное что-то с компом :(
 

SelenIT

IT-лунатик :)
PHP:
if (!preg_match('/^[a-z]$/',$v)) header(...
А с кодировками - это не у тебя с компом, это, к сожалению, на сайте PHP непонятности. Но разобрать пример синтаксиса ф-ции, имхо, можно и без пояснений...
 
Сверху