我在其中调用我的主页framework_ui.php我需要auth.php,其中我有一个过滤功能。
function filter($data)
{
// normalize $data because of get_magic_quotes_gpc
$dataNeedsStripSlashes = get_magic_quotes_gpc();
if ($dataNeedsStripSlashes) {
$data = stripslashes($data);
}
// normalize $data because of whitespace on beginning and end
$data = trim($data);
// strip tags
$data = strip_tags($data);
// replace characters with their HTML entitites
$data = htmlentities($data);
// mysql escape string
$data = mysql_real_escape_string($data);
return $data;
}
在每个带有get和post变量的页面上我都做了:(并调用我的framework.php)
// filter GET values
foreach ($_GET as $key => $value) {
$get[$key] = filter($value);
}
// filter post
foreach ($_POST as $key => $value) {
$post[$key] = filter($value);
}
如果我将上述功能设为上述功能并在每个页面上调用该功能,该功能是否仍能正常运行?
function filter_all() {
// filter GET values
foreach ($_GET as $key => $value) {
$get[$key] = filter($value);
}
// filter post
foreach ($_POST as $key => $value) {
$post[$key] = filter($value);
}
}
我知道这不是最安全的方式,但是我想知道这种事情是否可能并且不会对我的代码产生负面影响。
答案 0 :(得分:2)
你的filter_all()函数什么都不返回,它不会修改$ _GET和$ _POST全局变量,所以在你的函数完成运行那些原始变量后,你的foreach循环将实际上是相同的。您应该直接操作$ _GET / $ _ POST或全局$ get / $ post如果您打算使用它们或返回两者的某种组合。除此之外,没有必要对你的计划做什么负面的。
如果你打算这样做,每次都不能创建一个函数,只需要包含一个文件(比如你的framework_ui.php),它只是循环并过滤变量。
zerkms是正确的,虽然你的过滤器功能并不理想,因为它不安全,事实上如果你计划重新显示用户提交的信息(以及许多其他事情),mysql_real_escape_string会引起问题。
引用OWASP ESAPI项目页面:
不要编写自己的安全控件!在为每个Web应用程序或Web服务开发安全控件时重新发明轮子会导致浪费时间和大量安全漏洞。 OWASP企业安全API(ESAPI)工具包可帮助软件开发人员防范与安全相关的设计和实现缺陷。 http://code.google.com/p/owasp-esapi-php/
答案 1 :(得分:1)
您只需进行一些调整,以确保代码的其余部分可以使用“已过滤”值。有几种方法可以做到,将它们标记为global
或返回它们;可能第二种选择通常被认为是更清洁的。这是一个例子:
function filter_all() {
$get = array();
$post = array();
// filter GET values
foreach ($_GET as $key => $value) {
$get[$key] = filter($value);
}
// filter post
foreach ($_POST as $key => $value) {
$post[$key] = filter($value);
}
return array(
'get' => $get,
'post' => $post);
}
$aFilteredInput = filter_all();
$get = $aFilteredInput['post'];
$post = $aFilteredInput['post'];