在 PHP 页面上,我向用户显示数据库查询的结果。此外,我还让用户可以根据 3 个不同的参数过滤这些结果,以便仅显示数据库中的适当部分。我想知道我的方法是否足够安全,以及是否有更简单或更安全的方法可以达到相同的结果。
更深入:我使用过滤器 provider
, client
和phone
.
一个提供商可以拥有多个客户端,一个客户端可以拥有多部电话。用户通过<form method='GET'>
填写他们的过滤器,产生如下查询字符串:
?displayFilters[]=provider|1&displayFilters[]=client|&displayFilters[]=phone|3
在上述情况下,用户决定仅显示 provider
的结果‘1’,对于 phone
输入“3”。没有为 client
设置过滤器,因此在|
之后没什么。在我的页面中,我分析此查询字符串以将过滤器值放入适当的数组中,如下所示:
if (isset($_GET['displayFilters'])) {
$displayFiltersTmp = $_GET['displayFilters'];
foreach ($displayFiltersTmp as $value) {
$displayFilters[substr($value, 0, strpos($value, "|"))] = substr($value, strpos($value, "|")+1);
}
foreach ($displayFilters as $key => $value) {
if ($displayFiltersURL == "")
$displayFiltersURL .= "displayFilters".urlencode("[]") . "=" . $key . urlencode("|") . $value;
else
$displayFiltersURL .= "&displayFilters".urlencode("[]") . "=" . $key . urlencode("|") . $value;
}
}
这样我就可以更轻松地操作 MySQL 查询以根据要求过滤结果。
我还重新生成原始查询字符串以供其他用途。我这样做是因为可以在单独的页面中编辑此页面显示的结果。通过我的解决方案,我可以将这些过滤器作为(几个)GET 参数传递,然后可以将其传递回显示结果的原始页面。因此,编辑后,用户将返回到显示页面,并且仍然应用其过滤器。
我现在想知道这种方法是否“安全”(我在将过滤器应用于 MySQL 查询之前进行了必要的检查),而且还想知道是否有更简单和/或更优雅的解决方案来解决这个问题。
我现在所拥有的可以工作,但考虑到安全性和稳定性,我有些担忧。
感谢任何愿意调查此问题的人! 肯尼思·吉茨
最佳答案
关于安全性,我唯一要更改的是 urlencode()
$key
和 $value
变量而不是 []
和 |
字符。 $key
和 $value
参数是用户输入,这始终是任何代码的弱点。
注意:如果您要以 HTML 形式向访问者显示这些值,那么您应该使用 htmlspecialchars()
。但由于您只需要再次构建 url,那么 urlencode()
就足够了。
否则,只要您在查询数据库时使用准备好的语句(特别是在查询中使用用户输入时),您的代码就应该足够安全。
正如我们在评论中讨论的那样,还有其他方法可以完成您正在做的事情,但这并不是真正问题的答案,所以让我们将其留在评论中。
关于php - 以安全的方式传递用于过滤结果集从一个页面到另一个页面并返回的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41700435/