PHP 安全性(strip_tags,htmlentities)
PHP Security (strip_tags, htmlentities)
我在个人项目中工作,除了使用准备好的语句外,我还想将每个输入都用作威胁。为此我做了一个简单的函数。
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) 有一个 function/routine/class/method 用于过滤输入 (filter_input_array()
, strip_tags()
, str_ireplace()
, trim()
, ETC ...)。您可能想要创建使用循环进行过滤的函数。双重编码、one-time-strip-spoofing 等技巧可以击败 strip_tags()
.
等的单一用法
这是来自我的 Sanitizer
class 的 strip_tags()
包装器方法。
请注意它如何比较旧值和新值以查看它们是否相等。如果它们不相等,则继续使用 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()
或[=26转义输出=]相应地。
就魔术引号而言,最好的办法就是在 php.ini
.
中禁用它
现在,由于这些不同的构造具有各自的职责范围,您所要做的就是管理处理程序文件内的逻辑和数据流。这包括向用户提供错误消息(必要时)和处理 errors/exceptions。
如果数据从 HTML 表单直接进入数据库,则无需立即使用 htmlentities()
或 htmlspecialchars
。转义数据的目的是防止它被解释为新上下文中的可执行指令。将数据传递给 SQL 查询引擎时,htmlentities()
或 htmlspecialchars
没有危险可以解析(这就是为什么要过滤和验证输入,并使用 (PDO
) 准备好的原因陈述)。
但是,从数据库表和检索数据后是直接给浏览器,ok,现在用htmlentities()
或者htmlspecialchars
。创建一个 function
,它使用 for
或 foreach
循环来处理该场景。
这是我的 Escaper
class
的片段
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);
}
您必须根据自己的个人喜好和情况调整代码。
请注意,如果您计划在将数据发送到浏览器之前对其进行处理,请先进行处理,然后使用 handy-dandy htmlentities()
或 htmlspecialchars
循环函数进行转义。
你可以的!
两者的使用场景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 攻击....
我在个人项目中工作,除了使用准备好的语句外,我还想将每个输入都用作威胁。为此我做了一个简单的函数。
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) 有一个 function/routine/class/method 用于过滤输入 (filter_input_array()
, strip_tags()
, str_ireplace()
, trim()
, ETC ...)。您可能想要创建使用循环进行过滤的函数。双重编码、one-time-strip-spoofing 等技巧可以击败 strip_tags()
.
这是来自我的 Sanitizer
class 的 strip_tags()
包装器方法。
请注意它如何比较旧值和新值以查看它们是否相等。如果它们不相等,则继续使用 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()
或[=26转义输出=]相应地。
就魔术引号而言,最好的办法就是在 php.ini
.
现在,由于这些不同的构造具有各自的职责范围,您所要做的就是管理处理程序文件内的逻辑和数据流。这包括向用户提供错误消息(必要时)和处理 errors/exceptions。
如果数据从 HTML 表单直接进入数据库,则无需立即使用 htmlentities()
或 htmlspecialchars
。转义数据的目的是防止它被解释为新上下文中的可执行指令。将数据传递给 SQL 查询引擎时,htmlentities()
或 htmlspecialchars
没有危险可以解析(这就是为什么要过滤和验证输入,并使用 (PDO
) 准备好的原因陈述)。
但是,从数据库表和检索数据后是直接给浏览器,ok,现在用htmlentities()
或者htmlspecialchars
。创建一个 function
,它使用 for
或 foreach
循环来处理该场景。
这是我的 Escaper
class
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);
}
您必须根据自己的个人喜好和情况调整代码。
请注意,如果您计划在将数据发送到浏览器之前对其进行处理,请先进行处理,然后使用 handy-dandy htmlentities()
或 htmlspecialchars
循环函数进行转义。
你可以的!
两者的使用场景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 攻击....