在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-query之前做了必要的检查),但是否有更简单和/或更优雅的解决方案来解决这个问题。
我现在所做的是可行的,但我担心的是安全和可能是稳定的。
感谢任何愿意调查此事的人!肯尼斯·盖茨
发布于 2017-01-18 07:02:47
关于安全性,我唯一要更改的是urlencode()
$key
和$value
变量,而不是[]
和|
-characters。$key
和$value
参数是用户输入,这一直是任何代码的缺点。
注意:如果要在HTML中为访问者显示这些值,那么应该使用http://php.net/manual/en/function.htmlspecialchars.php。但是,由于您只打算再次构建url,那么urlencode()
就足够了。
否则,您的代码应该足够安全,只要您在查询数据库时使用准备好的语句(特别是在查询中使用用户输入时)。
正如我们在评论中所讨论的,有其他的方法来做你正在做的事情,但这并不是对实际问题的真正答案,所以让我们把它留在注释中。
https://stackoverflow.com/questions/41700435
复制相似问题