我正在尝试提出一个功能,该功能可以很好地清理某些字符串,以使它们可以安全地在URL中使用(如post slug),也可以安全地用作文件名。例如,当有人上传文件时,我要确保我从名称中删除所有危险字符。
到目前为止,我已经提出了以下功能,希望该功能可以解决此问题,并允许外来UTF-8数据。
/** * Convert a string to the file/URL safe "slug" form * * @param string $string the string to clean * @param bool $is_filename TRUE will allow additional filename characters * @return string */ function sanitize($string = '', $is_filename = FALSE) { // Replace all weird characters with dashes $string = preg_replace('/[^\w\-'. ($is_filename ? '~_\.' : ''). ']+/u', '-', $string); // Only allow one dash separator at a time (and make string lowercase) return mb_strtolower(preg_replace('/--+/u', '-', $string), 'UTF-8'); }
有没有人可以针对此运行任何棘手的示例数据-或知道一种更好的方法来保护我们的应用程序免受不良影响?
$ is-filename允许一些其他字符,例如temp vim文件
更新:删除了星号,因为我无法想到有效的用法
您对解决方案的一些观察:
“单词”字符是任何字母或数字或下划线字符,即可以作为Perl“单词”的一部分的任何字符。字母和数字的定义由PCRE的字符表控制,如果进行区域特定的匹配,则可能会有所不同。例如,在“ fr”(法语)语言环境中,某些大于128的字符代码用于带重音的字母,并且这些字符由\ w匹配。
您可能不应该在帖子中添加带重音符号的字符,因为从技术上讲,应该对它们进行百分比编码(按照URL编码规则),这样您的URL看起来很难看。
因此,如果我是您,则在小写之后将所有“特殊”字符转换为它们的等价字符(例如é-> e),并用“-”替换非[az]字符,限于运行单个“-”如您所愿。这里有一个转换特殊字符的实现:https : //web.archive.org/web/20130208144021/http : //neo22s.com/slug
OWASP具有企业安全API的PHP实现,其中包括安全编码和解码应用程序中输入和输出的方法。
编码器接口提供:
canonicalize (string $input, [bool $strict = true]) decodeFromBase64 (string $input) decodeFromURL (string $input) encodeForBase64 (string $input, [bool $wrap = false]) encodeForCSS (string $input) encodeForHTML (string $input) encodeForHTMLAttribute (string $input) encodeForJavaScript (string $input) encodeForOS (Codec $codec, string $input) encodeForSQL (Codec $codec, string $input) encodeForURL (string $input) encodeForVBScript (string $input) encodeForXML (string $input) encodeForXMLAttribute (string $input) encodeForXPath (string $input)
https://github.com/OWASP/PHP-ESAPI https://www.owasp.org/index.php/ 类别:OWASP_Enterprise_Security_API