Как победить подлую точку в запросе?

12
R
На сайте с 25.08.2012
Offline
16
727

Здравствуйте, уважаемые форумчане.

На сайте есть url'ы вида:

dir/category/123-article.name-p123

В .htaccess есть такое правило:

RewriteRule ^dir/([a-zA-Z-]+)/([\.a-zA-Z0-9-]+)$ dir/?category=$1&article=$2

Подскажите, пожалуйста, что нужно предпринять, что бы нельзя было открыть страницу

dir/category/123-article.name-p123

следующим образом:

dir/category/123-article.name-p123........................(любое кол-во точек)

Вообщем, что бы только по такого рода запросу открывать страница: [цифры] одно тире [буквы, цифры, точки] одно тире после чего одна буква [цифры]

Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#1

RewriteRule ^dir/([a-zA-Z-]+)/([\.a-zA-Z0-9-]+[0-9]+)$ dir/?category=$1&article=$2

[0-9]+ - означает что адрес должен заканчиваться на цифры(одна или больше).

Подпись))
Mik Foxi
На сайте с 02.03.2011
Offline
1217
#2

никак не победить, article.name - это ж тоже хз что в транслите, а в базу делается запрос по id 123? вместо точек ведь тоже можно ставить любую абракатабру?

Антибот, антиспам, веб фаервол, защита от накрутки поведенческих: https://antibot.cloud/ (8 лет на защите сайтов). Форум на замену серчу: https://foxi.biz/
C
На сайте с 04.02.2005
Offline
291
#3
На сайте есть url'ы вида:

dir/category/123-article.name-p123

В .htaccess есть такое правило:

RewriteRule ^dir/([a-zA-Z-]+)/([\.a-zA-Z0-9-]+)$ dir/?category=$1&article=$2

Что-то я сомневаюсь в правильности этого правила

после преобразования uri будет иметь вид

dir/?category=category&article=123-article.name-p123

siv1987
На сайте с 02.04.2009
Offline
427
#4

RewriteRule ^dir/([\w-]+)/([\w\d-]+\.\w+)$ dir/?category=$1&article=$2

R
На сайте с 25.08.2012
Offline
16
#5

Милованов Ю.С, спасибо за совет, но не помогло.

foxi, у меня еще есть проверка внутри скрипта.


$id=mysql_real_escape_string($_GET['article']);
$q="SELECT * FROM articles WHERE id='$id'";
$a=mysql_fetch_array(mysql_query($q));
$article=$a['id'].'-'.strtolower($a['name']).'-p'.$a['num'];
if($article==$_GET['article']){...}else echo '404';

И самое интересное, что если ввести, например,

dir/category/123---article...name---p123

то откроется 404, но если ввести

dir/category/123-article.name-p123.....(или одну точку в конце)

то страница

dir/category/123-article.name-p123

открывается без ошибок.

Как это предотвратить?

P.S. Кстати $_GET['article'] почему-то отбрасывает последние точки. И еще, если поставить в конце какой-нибудь другой символ вместо точки, то откроется 404.

siv1987, к сожалению, не помогло.

C
На сайте с 04.02.2005
Offline
291
#6
...только по такого рода запросу открывать страница: [цифры] одно тире [буквы, цифры, точки] одно тире после чего одна буква [цифры]

[0-9]+-[a-zA-Z_]?\.[a-zA-Z_]?-[a-zA-Z][0-9]+

вот, приблизительно, такой забор.

R
На сайте с 25.08.2012
Offline
16
#7

Вот так написал

^dir/([a-zA-Z-]+)/([0-9-]+-[\.a-zA-Z0-9-]+-p[0-9]+)$

Не помогло. Опять же точки в конце пропускает.

C
На сайте с 04.02.2005
Offline
291
#8

Это ж кто такое придумал?

$id=mysql_real_escape_string($_GET['article']);

$q="SELECT * FROM articles WHERE id='$id'";
$a=mysql_fetch_array(mysql_query($q));
$article=$a['id'].'-'.strtolower($a['name']).'-p'.$a['num'];
if($article==$_GET['article']){...}else echo '404';

Сначала селект непонятно чего, затем проверка с непонятно чем

$_GET['article'] = 123-article.name-p123

Select с таким id

а затем..!

$article=$a['id'].'-'.strtolower($a['name']).'-p'.$a['num'];

Не... тут трезвому не придумать такого.

И это работает?

R
На сайте с 25.08.2012
Offline
16
#9
И это работает?

Сам сейчас удивляюсь как я такое написал, и самое главное, что работает.

C
На сайте с 04.02.2005
Offline
291
#10

А полностью показать htaccess?

RewriteRule ^dir/([a-zA-Z-]+)/([0-9-]+-[\.a-zA-Z0-9-]+-p[0-9]+)$ [L]

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий