我正在从事个人项目,除了使用预备语句之外,我还想将每个输入用作威胁。为此我做了一个简单的功能。
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);
对不起,这可能是一个愚蠢的问题,但我想避免与我的代码有任何问题:) 谢谢你的帮助
答案 0 :(得分: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()
或htmlspecialchars
转义输出。
就魔术引语而言,最好的办法就是在php.ini
中禁用它。
现在,由于各种构造都有自己的职责范围,您所要做的就是管理处理程序文件中的逻辑和数据流。这包括向用户提供错误消息(必要时)和处理错误/异常。
如果数据从HTML表单直接进入数据库,则无需立即使用htmlentities()
或htmlspecialchars
。转义数据的目的是防止它在新上下文中被解释为可执行指令。将数据传递给SQL查询引擎时,没有任何危险htmlentities()
或htmlspecialchars
可以解决(这就是您过滤和验证输入并使用(PDO
)预处理语句的原因)。 / p>
但是,在从 数据库表中检索数据 并且 直接指定用于浏览器之后,确定,现在使用htmlentities()
或htmlspecialchars
。创建一个使用function
或for
循环来处理该方案的foreach
。
以下是我的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
循环函数进行转义。
你可以做到!
答案 1 :(得分:0)
strip_tags() and htmlentities or htmlspecialchars().
1。)如果你想剥离任何可能是易受XSS攻击影响的表单输入的html元素,那么使用
在插入数据库之前的strip_tags()
函数
实施例
$data= strip_tags('<b>Hello</b>');
您的输出将是&#34;您好&#34;这就是要传递给服务器的内容。
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攻击....