如何防止XSS和CSS注入?

时间:2013-06-04 19:11:39

标签: php xss

我已经完成了处理CSS和XSS注入的功能,但它仍然可以通过。

有人对我说了以下内容,但我不确定这意味着什么:

  

在sanitize_input函数上,执行strip_tags以删除可能已通过表单添加的所有html标记。在strip_tags上阅读php.net。

这是我的代码:

private function sanitizeInput() {
    foreach($_POST as &$post) {
        $post = $this -> db -> real_escape_string($post);
    }
}

3 个答案:

答案 0 :(得分:1)

你在错误的地方做工作。

为防止SQL注入,use prepared/parameterized queries with PDO。这从根本上将数据与命令分开,使其免受一般SQL注入问题的影响。

您对XSS的问题无疑是因为您在HTML上下文中使用任意数据而没有任何转义。在数据的输出上,使用htmlspecialchars()。这会将所有特殊字符编码为正确的实体。

答案 1 :(得分:0)

您拥有的代码可以安全地输入数据库。但是,对数据库来说安全的可能对HTML不安全。

通常,您应该使用该函数来插入数据,并在以后检索它时,在输出之前通过类似htmlspecialchars的函数运行它。但是,请勿在保存数据之前执行此操作,只能在最终输出阶段执行此操作。

答案 2 :(得分:0)

这取决于......您希望能够保存标签,但不能在浏览器中呈现它们吗?如果是这样,请使用htmlentities。如果没有,请使用strip_tags。

也许:

private function sanitizeInput() {
  foreach($_POST as $key => $val) {
    $_POST[$key] = $this->db->real_escape_string(htmlentities($val, ENT_QUOTES));
  }
}

这实际上取决于你想要完成的事情。

上面的示例会将A 'quote' is <b>bold</b>转换为A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;

然而,这个解决方案并不理想。在保存到数据库之前,不应转换数据。相反,您希望在从数据库中查询数据后处理数据。