URL 中应该允许哪些字符以及如何确保/删除不需要的字符


What characters should be allowed in a URL and How do I make sure / get rid of unwanted characters?

可能的重复项:
终极清洁/安全功能

我正在寻找一些解决方案,以确保我的 $_GET 传入数据仅包含所需的内容,而不是其他一些危险字符等。这样做的最佳验证/清理将如何?我认为正则表达式可以在这里发挥一些作用:

if (isset($_GET['p'])) {
 //validate //sanitize etc...
//call controller... or whatever.
}

要验证或清理您的输入,请使用 PHP 的过滤器函数:

验证

用于验证或检查数据是否符合某些要求 资格。例如,传入FILTER_VALIDATE_EMAIL将 确定数据是否为有效的电子邮件地址,但不会更改 数据本身。

清理将清理数据,因此它可能会通过删除来更改它 不需要的字符。例如,传入FILTER_SANITIZE_EMAIL 将删除不适合电子邮件地址的字符 包含。也就是说,它不会验证数据。


如果要显示数据,则需要转义 HTML 实体。您可以使用 htmlentities 函数执行此操作。


您要将数据存储在数据库中吗?根据您连接到数据库的方式(MySQL函数,MySQLi或PDO(,您需要(分别(使用mysql_real_escape_string,mysqli::real_escape_string或mysqli_real_escape_string,或PDO::quote或预准备语句。


是否要使用 URL 中的值?然后你需要使用 urlencode 函数。

如果我正确理解您的问题,您可以使用百分比编码。更多信息在这里。

在 PHP 中,这将是:

<?php
echo '<a href="mycgi?foo=', urlencode($userinput), '">';
?>

这取决于 $_GET 参数的内容。使用 REGEX 或字符串函数删除不必要的字符。例如:如果您的变量是页码,则删除所有不是数字的内容。如果是某种排序值,则检查可能的值(asc/desc/...(并删除其余值。只保留您需要的内容。这应该是最安全的方式。

对于其他内容,请使用urlencode((和urldecode((,这样您就可以传递每个可能的字符。但是,当您将此输入用于其他事情(例如保存到数据库或显示数据(时要小心!始终使用 mysql_real_escape_string((、htmlentities(( 和类似的函数来编码 $_GET 参数的内容。