【问题标题】:PHP escape special character in URL paramURL参数中的PHP转义特殊字符
【发布时间】:2026-01-09 08:50:01
【问题描述】:

我正在努力删除通过 URL 传递参数时的特殊字符,以避免被入侵者注入,例如我有以下 URL:

www.sitename.com/people?job=manager

我在参数之后添加了一个alert 脚本,如下所示:

www.sitename.com/people?job=manager"/><script>alert%2844749%29<%2fscript>

当我运行 URL 时,alert 会弹出,这可能会导致通过这种技术检索站点信息的漏洞。我将使用$_REQUEST 来获取传递参数以生成结果。这是我可以在下面应用的任何逃避 URL 注入技术的方法吗?

$job = $_REQUEST["job"];

感谢您的建议。

【问题讨论】:

  • 如果你只是在 URL 中有这个 ,为什么会弹出警报?!您是否将其按原样输出到 HTML 中?

标签: php escaping


【解决方案1】:

您需要在所有变量上使用htmlentities()htmlspecialchars()ENT_QUOTES 参数。

例如$job

$job = htmlentities($_REQUEST["job"], ENT_QUOTES);

不需要转义 url 参数中的特殊字符。

【讨论】:

    【解决方案2】:

    您可以使用strip_tags()

    <?php
    $text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>';
    echo strip_tags($text);
    echo "\n";
    
    // Allow <p> and <a>
    echo strip_tags($text, '<p><a>');
    ?>
    

    或者使用正则表达式--

    $data = preg_replace('/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi', '', $data);
    

    【讨论】:

      【解决方案3】:

      使用htmlspecialchars 转义特殊的html 字符或使用strip_tags 删除字符串中的所有标签。

      【讨论】:

        【解决方案4】:

        首先是don't use $_REQUEST,为了防止CSRF攻击,您可以使用html_entities()strip_tags()

        如果您希望允许某些标签,您可以使用HTML purifier

        【讨论】:

          【解决方案5】:

          一个网址喜欢

          www.sitename.com/people?job=manager"/><script>alert%2844749%29<%2fscript>
          

          不会做任何对自身有害的事情。

          这样的URL,任何这样的值,直接输出到HTML当然会导致HTML注入。这就是为什么你需要 HTML 转义 它:

          <?php $url = 'www.sitename.com/people?job=manager"/><script>alert%2844749%29<%2fscript>'; ?>
          
          <a href="<?php echo htmlspecialchars($url, ENT_QUOTES); ?>">Click here</a>
          

          【讨论】:

            【解决方案6】:

            使用 urlencode 函数。访问https://www.php.net/manual/en/function.urlencode.php了解更多信息。

            【讨论】:

              【解决方案7】:

              相反,您可以使用以下代码直接filter 您的输入:

              $job = filter_input(INPUT_GET, 'job', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
              

              【讨论】: