5

我正在从事个人项目,除了使用准备好的陈述外,我还想将每个输入都用作威胁。为此,我做了一个简单的功能。

function clean($input){
if (is_array($input)){
    foreach ($input as $key => $val){
        $output[$key] = clean($val);
    }
}else{
    $output = (string) $input;
    if (get_magic_quotes_gpc()){
        $output = stripslashes($output);
    }
    $output = htmlentities($output, ENT_QUOTES, 'UTF-8');

}
return $output;
}

这是足够的还是我应该使用以下代码?

        $output = mysqli_real_escape_string($base, $input);
        $output = strip_tags($output);

抱歉,这可能是一个愚蠢的问题,但我想避免我的代码出现任何问题 :) 感谢您的帮助

4

2 回答 2

5

我为你的努力鼓掌。友好的社区成员,您必须考虑将您的运营脱钩。

1 ) 有一个用于过滤输入的函数/例程/类/方法(filter_input_array(), strip_tags(), str_ireplace(), trim(), 等...)。您可能想要创建使用循环进行过滤的函数。诸如双重编码、一次性欺骗等技巧可以击败像strip_tags().

这是我班级的strip_tags()包装方法。Sanitizer注意它是如何将旧值与新值进行比较以查看它们是否相等。如果它们不相等,则继续使用strip_tags(). 虽然,在执行此方法之前,有相当多的初步 INPUT_POST / $_POST 检查完成。这个使用的另一个版本trim()实际上是在这个之前执行的。

private function removeHtml(&$value)
{    
    if (is_scalar($value)) {
        do {
            $old = $value;
            $value = strip_tags($value);

            if ($value === $old) {
                break;
            }
        } while(1);
    } else if (is_array($value) && !empty($value)) {
        foreach ($value as $field => &$string) {
            do {
                $old = $string;
                $string = strip_tags($string);

                if ($string === $old) {
                    break;
                }
            } while (1);
        }
    } else {
       throw new Exception('The data being HTML sanitized is neither scalar nor in an array.');
    }

    return;
}

2 ) 有另一个用于验证输入 ( filter_var_array(), preg_match(), mb_strlen, 等...)

然后,当您的数据需要切换上下文时......

A)对于数据库,使用准备好的语句(PDO最好)。

B ) 为了将用户输入返回/传输到浏览器,使用htmlentities()or相应地转义输出htmlspecialchars

就魔术引号而言,最好的办法就是在php.ini.

现在,由于这些不同的结构都有自己的职责范围,您所要做的就是管理处理程序文件中的逻辑和数据流。这包括向用户提供错误消息(必要时)和处理错误/异常。

如果数据从 HTML 表单直接进入数据库,则无需使用htmlentities()或立即使用。htmlspecialchars转义数据的目的是防止它被解释为新上下文中的可执行指令。将数据传递给 SQL 查询引擎时没有危险htmlentities()htmlspecialchars可以解决(这就是您过滤和验证输入并使用 ( PDO) 准备好的语句的原因)。

但是,在从数据库表中检索数据并直接发往浏览器之后,好的,现在使用htmlentities()or htmlspecialchars。创建一个function使用fororforeach循环来处理该场景的。

这是我Escaper课堂上的一个片段

public function superHtmlSpecialChars($html)
{
     return htmlspecialchars($html, ENT_QUOTES | ENT_HTML5, 'UTF-8', false);
}

public function superHtmlEntities(&$html)
{
    $html = htmlentities($html, ENT_QUOTES | ENT_HTML5, 'UTF-8', false);
}

public function htmlSpecialCharsArray(array &$html)
{       
    foreach ($html as &$value) {
        $value = $this->superHtmlSpecialChars($value);
    }

    unset($value);
}

public function htmlEntitiesArray(array &$html)
{       
    foreach ($html as &$value) {
        $this->superHtmlEntities($value);
    }

    unset($value);
}

您必须根据自己的个人喜好和情况定制代码。

请注意,如果您计划在将数据发送到浏览器之前对其进行处理,请先进行处理,然后使用方便的花花公子htmlentities()htmlspecialchars循环功能进行转义。

你能行的!

于 2017-02-19T18:59:21.100 回答
0

两者的使用场景strip_tags() and htmlentities or htmlspecialchars().

1.) 如果您想从可能容易受到 XSS 攻击的表单输入中删除任何 html 元素,请 strip_tags()在插入数据库之前使用函数示例

$data= strip_tags('<b>Hello</b>');

您的输出将是“Hello”,这就是要传递给服务器的内容。

2.) 如果您想将数据打印到浏览器或屏幕上,您可以使用htmlentities() or htmlspecialchars() 以下是可以使用的使用场景。

//DB PDO Connect....
$result2 = $db->prepare('select * from users where uid=:uid');
        $result2->execute(array(':uid' =>'1'));

 while ($row = $result2->fetch()) {


$pic=htmlentities($row['profilepic'], ENT_QUOTES, "UTF-8");
}

然后你可以在任何你想要的地方打印 $pic 并且不受 XSS 攻击......

于 2017-02-19T20:19:01.913 回答