PHP安全:编码如何被误用?

PHP安全:编码如何被误用?,php,security,encoding,utf-8,mbstring,Php,Security,Encoding,Utf 8,Mbstring,从这个极好的“问题”中,我了解到: 不幸的是,您应该验证每个提交的字符串是否有效 在您尝试存储或在任何地方使用UTF-8之前。PHP的 mb_check_encoding()可以做到这一点,但您必须使用它 虔诚地。作为恶意客户端,真的没有办法解决这个问题 可以提交他们想要的任何编码的数据,我还没有找到 让PHP可靠地完成这项工作的诀窍 现在,我仍在学习编码的怪癖,我想知道恶意客户端可以做些什么来滥用编码。一个人能做到什么?有人能举个例子吗?假设我将用户输入保存到MySQL数据库中,或者通过电子邮

从这个极好的“问题”中,我了解到:

不幸的是,您应该验证每个提交的字符串是否有效 在您尝试存储或在任何地方使用UTF-8之前。PHP的 mb_check_encoding()可以做到这一点,但您必须使用它 虔诚地。作为恶意客户端,真的没有办法解决这个问题 可以提交他们想要的任何编码的数据,我还没有找到 让PHP可靠地完成这项工作的诀窍


现在,我仍在学习编码的怪癖,我想知道恶意客户端可以做些什么来滥用编码。一个人能做到什么?有人能举个例子吗?假设我将用户输入保存到MySQL数据库中,或者通过电子邮件发送,如果我不使用
mb\u check\u编码
功能,用户如何造成伤害

这似乎是一个复杂的攻击。检查文档中的
mb\u check\u encoding
会注意到“无效编码攻击”。谷歌搜索“无效编码攻击”带来了一些有趣的结果,我将尝试解释这些结果

当这类数据被发送到服务器时,它将执行一些解码来解释发送过来的字符。现在,服务器将进行一些安全检查,以查找可能有害的某些特殊字符的编码版本

当向服务器发送无效编码时,服务器仍然运行其解码算法,并将评估无效编码。这就是问题发生的地方,因为安全检查可能没有寻找在执行解码算法时仍然会产生有害字符的无效变体

请求unix系统上完整目录列表的攻击示例:

http://host/cgi-bin/bad.cgi?foo=..%c0%9v../bin/ls%20-al |

如果您想要更详细的算法技术解释,这里有一些链接:

如果我不使用mb_check_编码功能,用户如何造成伤害

这是关于

由于UTF-8设计的一个不幸的怪癖,有可能产生字节序列,如果使用原始的位打包解码器进行解析,将产生与较短字节序列相同的字符,包括单个ASCII字符


例如,角色
非常有趣,谢谢!这对这件事有相当大的启示。作为一个编码noob,我不清楚的是,我如何测试它?为了向我的网站提交
0xC0 0xBC
,以便检查漏洞,我需要做什么?我假设我不能使用(现代)浏览器,那么用什么来测试呢?我应该使用旧的歌剧版本吗?我如何发布这些类型的字符序列?我是把
0xC0 0xBC
当作文本来发布,还是用不同的方式发布?我宁愿发布一个新问题来询问如何