PHP 转义 URL 参数中的特殊字符


PHP escape special character in URL param

我正在努力删除通过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"];

谢谢你的建议。

您需要

在所有变量上使用带有ENT_QUOTES参数的htmlentities()htmlspecialchars()

例如,对于$job

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

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

首先不要使用 $_REQUEST 并且为了防止 CSRF 攻击,您可以使用 html_entities()strip_tags()

如果您希望允许某些标签,则可以使用HTML净化器。

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

一个网址,比如

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>

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

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

$job = filter_input(INPUT_GET, 'job', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
您可以使用

strip_tags() .

$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);