首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP XSS清理

PHP XSS清理
EN

Stack Overflow用户
提问于 2011-05-13 11:27:29
回答 2查看 6.3K关注 0票数 7

问题:

为了避免UTF8编码的页面出现XSS,最好的safe1()、safe2()、safe3()和safe4()函数是什么?它在所有浏览器(特别是IE6)中都是安全的吗?

代码语言:javascript
复制
<body><?php echo safe1($xss)?></body>

<body id="<?php echo safe2($xss)?>"></body>

<script type="text/javascript">
  var a = "<?php echo safe3($xss)?>";
</script>

<style type="text/css">
  .myclass {width:<?php echo safe4($xss)?>}
</style>

许多人说,可以做的最好的事情是:

代码语言:javascript
复制
// safe1 & safe2
$s = htmlentities($s, ENT_QUOTES, "UTF-8");

// But how would you compare the above to:
//    https://github.com/shadowhand/purifier
// OR http://kohanaframework.org/3.0/guide/api/Security#xss_clean
// OR is there an even better if not perfect solution?

代码语言:javascript
复制
// safe3
$s = mb_convert_encoding($s, "UTF-8", "UTF-8");
$s = htmlentities($s, ENT_QUOTES, "UTF-8");

// How would you compare this to using using mysql_real_escape_string($s)?
// (Yes, I know this is a DB function)
// Some other people also recommend calling json_encode() before passing to htmlentities
// What's the best solution?

有一大堆关于PHP和XSS的文章。大多数人只是说“使用HTMLPurifier”或“使用htmlspecialchars",或者是错的。其他人说使用OWASP --但它非常慢。下面列出了我遇到的一些好帖子:

Do htmlspecialchars and mysql_real_escape_string keep my PHP code safe from injection?

XSS Me Warnings - real XSS issues?

CodeIgniter - why use xss_clean

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-13 14:24:44

safe2()显然是htmlspecialchars()

实际上,您应该使用HTMLPurifier来清理safe1()的完整blob,而不是HTML。它去掉了不需要的属性、标签,尤其是任何javascriptish。是的,它很慢,但它涵盖了所有允许安全的HTML用户片段重用的小的边缘情况(甚至对于较旧的IE版本)。但请查看http://htmlpurifier.org/comparison,以获得替代方案。--如果您真的只想在那里显示原始用户文本(没有过滤的html),那么htmlspecialchars(strip_tags($src))实际上可以很好地工作。

safe3()尖叫正则表达式。在这里,您实际上只能将白名单应用于您实际想要的任何内容:

代码语言:javascript
复制
var a = "<?php echo preg_replace('/[^-\w\d .,]/', "", $xss)?>";

当然,您可以在这里使用json_encode来获得完全有效的JS语法和变量。但是,您只需将该字符串的可利用性延迟到JS代码中,然后您就必须照看它。

在所有浏览器(特别是IE6)中都是安全的吗?

如果您显式指定字符集,那么IE将不会执行其糟糕的内容检测魔术,因此可以忽略UTF7漏洞。

票数 4
EN

Stack Overflow用户

发布于 2011-05-13 11:45:24

http://php.net/htmlentities请注意可选的第三个参数部分,该参数采用字符编码。您应该使用它而不是mv_convert_encoding。只要php文件本身是用utf8编码保存的就可以了。

代码语言:javascript
复制
htmlentities($s, ENT_COMPAT, 'UTF-8');

至于直接将变量注入javascript,您可以考虑将内容放入页面中其他位置的隐藏html元素中,并在需要时将内容从dom中拉出。

当您想要实际显示用户提交的html时(如在中,允许浏览器实际呈现),可以使用您提到的净化器。使用htmlentities将对所有内容进行编码,以便在ui中显示字符,但浏览器不会解释任何实际代码。你的目标是做什么?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5986972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档