Безопасный анализ ссылки в стиле уценки


Я написал некоторый код для сопоставления и анализа ссылки уценки этого стиля:

[click to view a flower](http://www.yahoo.com/flower.html)

У меня есть этот код, предназначенный для извлечения текста ссылки, затем самого URL-адреса, а затем вставьте их в ссылку A HREF. Я беспокоюсь, хотя, возможно, я упускаю возможность для кого-то ввести XSS, потому что я оставляю приличное количество символов. безопасно ли это?

$pattern_square = '\[(.*?)\]';
$pattern_round  = "\((.*?)\)";

$pattern = "/".$pattern_square.$pattern_round."/";

preg_match($pattern, $input, $matches);
$words = $matches[1];
$url   = $matches[2];

$words = ereg_replace("[^-_@0-9a-zA-Z\.]", "", $words);
$url   = ereg_replace("[^-A-Za-z0-9+&@#/%?=~_|!:.]","",$url);

$final = "<a href='$url'>$words</a>";

Кажется, это работает нормально, и это действительно исключает некоторые глупые URL-адреса, которые включают точки с запятой и обратные косые черты, но Меня не волнуют эти URL-адреса.

Author: Boann, 0000-00-00

1 answers

Если вы уже передали ввод через htmlspecialchars ( который вы являются делаешь, верно?), то уже невозможно, чтобы ссылки содержали какие-либо символы, которые могли бы вызвать XSS.

Если вы еще не передали входные данные через htmlspecialchars, то не имеет значения, какую фильтрацию вы выполняете при анализе ссылок, потому что вы уже облажались, потому что можно тривиально включить произвольный HTML или XSS вне ссылок.

Эта функция будет безопасно анализировать ссылки уценки в тексте при применении htmlspecialchars к нему:

function doMarkdownLinks($s) {
    return preg_replace_callback('/\[(.*?)\]\((.*?)\)/', function ($matches) {
        return '<a href="' . $matches[2] . '">' . $matches[1] . '</a>';
    }, htmlspecialchars($s));
}

Если вам нужно сделать что-то более сложное, чем это, я советую вам использовать существующий синтаксический анализатор, потому что в таких вещах слишком легко ошибиться.

 1
Author: Boann, 2014-08-03 11:40:29