可能重复:
终极清洁/安全功能
我正在寻找一些解决方案,以确保我的 $_GET 传入数据仅具有所需的内容,而不具有其他一些危险字符等。如何进行此操作的最佳验证/清理?我假设 REGEXP 可以在这里发挥一些作用:
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或prepared statements。
您想使用 URL 中的值吗?然后你需要使用urlencode函数。
如果我正确理解您的问题,您可以使用百分比编码。更多信息在这里。
在 PHP 中,这将是:
<?php
echo '<a href="mycgi?foo=', urlencode($userinput), '">';
?>
这取决于 $_GET 参数的内容。使用 REGEX 或字符串函数删除不必要的字符。例如:如果您的变量是页码,则删除所有不是数字的内容。如果它是某种排序值,则检查可能的值(asc/desc/...)并删除其余值。只保留您需要的内容。这应该是最安全的方式。
对于其他内容,请使用urlencode()和urldecode(),这样您就可以传递所有可能的字符。但是当你将此输入用于其他事情时要小心(例如保存到数据库或显示数据)!始终使用mysql_real_escape_string()、htmlentities()和类似的函数来编码 $_GET 参数的内容。