Php 如何防止XSS和CSS注入?
我已经做了一个处理CSS和XSS注入的函数,但它仍然能够通过 有人对我说了以下话,但我不确定这是什么意思: 在sanitize_输入函数中,执行strip_tags以剥离所有可能通过表单添加的html标记。在strip_标签上阅读php.net 这是我的密码: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
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()
!你把你的数据弄得一团糟。