PHP 安全性(strip_tags、htmlentities)

标签 php security strip-tags stripslashes

我在个人项目中工作,除了使用准备好的语句外,我还想将每个输入都用作威胁。为此,我做了一个简单的函数。

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);

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

最佳答案

我为你的努力鼓掌。 友好的社区成员,您必须考虑分离您的操作。

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

这是一个strip_tags()我的包装器方法 Sanitizer类(class)。 请注意它如何比较旧值和新值以查看它们是否相等。如果它们不相等,它会继续使用 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() 转义输出或 htmlspecialchars相应地。

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

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

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

但是,在数据 数据库表直接指定给浏览器后,就可以了, 现在使用 htmlentities()htmlspecialchars .创建 function使用 forforeach循环来处理这种情况。

这是我的 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循环函数。

你可以的!

关于PHP 安全性(strip_tags、htmlentities),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42330228/

相关文章:

php - 创建电子邮件验证代码时限制长度是否不好?

security - Go Web 应用程序中的 CSRF

asp.net - 无 Cookie session 是否存在安全风险?

ruby-on-rails - 如何限制 Rack 中的请求大小?

PHP 防止 strip_tags 删除损坏的标签

php - 使用 php 从网站/html 页面获取所有可翻译文本

php - 有什么办法可以批量处理文件夹中 "pretty"格式的PHP文件吗?

php - 如何关闭 phalcon 数据库连接?

Javascript:用所需的类剥离标签

php - 错误 : Class 'SplEnum' not found in PHP 7