我为你的努力鼓掌。友好的社区成员,您必须考虑将您的运营脱钩。
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
使用for
orforeach
循环来处理该场景的。
这是我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
循环功能进行转义。
你能行的!