Php 如何防止XSS和CSS注入?

Php 如何防止XSS和CSS注入?,php,xss,Php,Xss,我已经做了一个处理CSS和XSS注入的函数,但它仍然能够通过 有人对我说了以下话,但我不确定这是什么意思: 在sanitize_输入函数中,执行strip_tags以剥离所有可能通过表单添加的html标记。在strip_标签上阅读php.net 这是我的密码: private function sanitizeInput() { foreach($_POST as &$post) { $post = $this -> db -> real_escape

我已经做了一个处理CSS和XSS注入的函数,但它仍然能够通过

有人对我说了以下话,但我不确定这是什么意思:

在sanitize_输入函数中,执行strip_tags以剥离所有可能通过表单添加的html标记。在strip_标签上阅读php.net

这是我的密码:

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

您拥有的代码使您的输入可以安全地插入到数据库中。但是,对于数据库安全的内容对于HTML可能并不安全


通常,您应该使用该函数来插入数据,当您稍后检索数据时,您可以在输出数据之前运行它。但是,在保存数据之前不要这样做,只能在最后的输出阶段这样做。

您在错误的地方做了工作

要防止SQL注入。这从根本上将数据与命令分离,使其不受一般SQL注入问题的影响


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

这取决于。。。是否希望能够保存标记,但不在浏览器中渲染它们?如果是,请使用htmlentities。如果没有,请使用带标签

也许:

private function sanitizeInput() {
  foreach($_POST as $key => $val) {
    $_POST[$key] = $this->db->real_escape_string(htmlentities($val, ENT_QUOTES));
  }
}
这真的取决于你想要完成什么

上面的例子可以转换为:
A'quote'是粗体的
A';报价';是b旧/b


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

您根本没有在那里进行任何清理。您只是在进行一些SQL上下文转义,而这并不能从根本上“修复”恶意数据。如果您不打算在SQL查询中使用这些数据,那么这种转义也是毫无意义的?您还应该具有strip_tags功能:
$post=strip_tags($this->db->real_escape_string($post))如果您想删除标记。这看起来像是防止SQL注入,而不是跨站点脚本。实现前者最简单的方法是通过参数化,这可以通过PDO和MySQLi获得-如果您仍然使用
mysql\u real\u escape\u string()
那么您仍然需要升级,因为该库不再使用。要删除HTML标记,您应该在渲染时执行此操作,如果根本不存在HTML(通常情况下),或者当您存储到数据库时,如果您希望接受有限数量的安全HTML。哇,谢谢,好的,我理解您的意思,比如$HTML value=“”。htmlspecialchars(stripcslashes($\u POST['userName'))。“/>??他的意思是使用PDO,它是PHP访问mysql的驱动程序。关于如何在他提供的链接中使用,有很多很好的例子。@LearningPhPbasics,不!看到我的答案了吧:你不能把一堆转义函数放在一起,期望得到一个有用的结果。只有在你需要的时候,在正确的位置逃跑。不要过早地对HTML进行编码。切勿使用
stripslashes()
。不要同时使用
htmlspecialchars()
htmlspecialchars()
!你把你的数据弄得一团糟。