【问题标题】:Parsing a Markdown style link safely安全地解析 Markdown 样式链接
【发布时间】:2014-07-27 20:48:41
【问题描述】:

我已经编写了一些代码来匹配和解析这种风格的 Markdown 链接:

[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。

【问题讨论】:

  • ereg 库已弃用多年,你真的应该切换到 preg。
  • 有十几个 php markdown 解析器,为什么不使用其中一个。

标签: php regex xss markdown


【解决方案1】:

如果您已经通过htmlspecialchars 传递了输入(您正在这样做,对吗?)那么链接已经不可能包含任何字符可能导致 XSS。

如果您还没有通过htmlspecialchars 传递输入,那么在解析链接时进行什么过滤并不重要,因为您已经搞砸了,因为可以轻松包含任意 HTML 或 XSS 在链接之外

此函数将安全地解析文本中的 Markdown 链接,同时在其上应用 htmlspecialchars

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

如果你需要做比这更复杂的事情,我建议你使用现有的解析器,因为这种事情太容易出错了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 2012-07-20
    相关资源
    最近更新 更多