前段时间我发现了这个,我认为很棒,在某些代码中代码片段来过滤POST并从注入中获取数据。
function filter($data) { //Filters data against security risks.
$data = trim(htmlentities(strip_tags($data)));
if(get_magic_quotes_gpc()) $data = stripslashes($data);
$data = mysql_real_escape_string($data);
return $data;
}
foreach($_GET as $key => $value) $filterGet[$key] = filter($value);
foreach($_POST as $key => $value) $filterPost[$key] = filter($value);
从那时起我就一直在使用它。但今天,在通过ajax发送数组时,我遇到了大量错误。大多数人都说strip_tags() expects parameter 1 to be string, array given in...
过滤数据的最佳方法是什么?所有这些数据都将转移到数据库中。但是它不会进入数据库的情况呢?
答案 0 :(得分:4)
以下是您需要的功能:
function filter($data) { //Filters data against security risks.
if (is_array($data)) {
foreach ($data as $key => $element) {
$data[$key] = filter($element);
}
} else {
$data = trim(htmlentities(strip_tags($data)));
if(get_magic_quotes_gpc()) $data = stripslashes($data);
$data = mysql_real_escape_string($data);
}
return $data;
}
答案 1 :(得分:1)
正如错误消息所清楚的那样,这种情况发生在通过GET / POST传递数组的情况下。对于这种情况,您可以解析数组的每个值。
foreach($_GET as $key => $value){
if(is_array($value)){
foreach($value as $val){
$filterGet[$key][] = filter($val);
}
}
else{
$filterGet[$key] = filter($value);
}
}
答案 2 :(得分:0)
你应该做的是首先检查$ data是否是你需要它的正确格式。你所描述的是一个数组被传递到你的函数的$ data参数,PHP需要你把它分解成一个字符串。需要一些额外的逻辑,例如:
function filter($data) {
if(is_array($data)) {
foreach($data as $key => $value) {
// Do stuff...
}
} else {
// Do stuff...
}
}
答案 3 :(得分:0)
您应该检查输入是否是数组。如果是这样,请为每个数组成员循环并剥离标记,否则,只需为输入剥去标记。
答案 4 :(得分:0)
你可以使用array_walk
<?php
function wsafe(&$value,$key)
{
return safe($value);
}
function safe($value)
{
if(is_array($value))
{
foreach($value as $key=>$val)
{
$value[safe($key)] = safe($val);
}
}
else
{
$value = trim(htmlentities(strip_tags($value)));
if(get_magic_quotes_gpc()) $value = stripslashes($value);
$value = mysql_real_escape_string($value);
}
}
array_walk($_POST,'wsafe');
array_walk($_GET,'wsafe');