如何使用PHP防止URL表单字段中的HTML注入?

时间:2010-10-28 00:30:54

标签: php url xss code-injection

例如,如果我在表单中选择 [URL值] ,将 [URL值] 保存在数据库中,然后在页面中使用它这样:

<a href="[URL value]" > The Link </a>

如何防止此[URL值]:

http://www.somelink.com"> Evil text or can be empty </a>  ALL THE EVIL HTML I WANT  <a href="

我如何防止这种针对URL表单文件的HTML注入,而不会破坏URL,以防它有效?

5 个答案:

答案 0 :(得分:6)

在表单上收到网址时:

  • 使用filter_var(url, FILTER_VALIDATE_URL)确保网址格式有效。
  • 确保网址以http://https://开头(或至少拒绝所有javascript:网址,因为它们可能包含恶意代码)
  • 在数据库中插入URL(和其他表单数据)时使用预准备语句,或正确转义该数据以防止SQL注入。


显示页面时:

  • 使用htmlspecialchars()转义您在HTML中插入的网址(以及所有其他文字)。

答案 1 :(得分:1)

最简单的方法是检查输入是否包含看起来像语法有效的URL,没有像&gt;这样的字符。这是URL中不允许的。最简单的方法是使用filter extension。执行此操作的代码如下:

if (filter_var($url, FILTER_VALIDATE_URL)) {
    //Valid URL submitted
} else {
    //Invalid URL submitted
}

答案 2 :(得分:0)

编辑:只使用urlencode,不要使用htmlentities

每当您将数据放入URL的键/值对时,您应该使用urlencode()对该数据进行编码。此函数将处理任何特殊字符,这些字符在URL的构造方式中具有语法含义。符号,等号和问号将为您编码。注入HTML中的所有尖括号和新行字符也将被编码!

<?php $TheVariable = $_REQUEST['suspect_var']; // Untrusted data ?>


<a href="http://www.mysite.com/script.php?untrusted_data=<?php echo urlencode($TheVariable) ?>">The Link</a>

答案 3 :(得分:0)

用于在显示使用htmlentities($ var,ENT_QUOTES)或htmlspecialchars($ var,ENT_QUOTES)时转义。由于浏览器特定的XSS有效负载,它需要转义单引号和双引号。点击此处 - http://ha.ckers.org/xss2.html

另外,在验证URL javascript时:URI不是唯一危险的。另一个是数据:URI。

无论如何,排除除白名单之外的所有内容总是更安全,然后包括除黑名单之外的所有内容。

答案 4 :(得分:-1)

在打印网址时,使用urlencode仅对"符号进行编码,例如:

echo '<a href="'.str_replace('"', urlencode('"'), $url).'">link name</a>';