一尘不染

清理字符串以使它们的URL和文件名安全吗?

php

我正在尝试提出一个功能,该功能可以很好地清理某些字符串,以使它们可以安全地在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文件

更新:删除了星号,因为我无法想到有效的用法


阅读 219

收藏
2020-05-26

共1个答案

一尘不染

您对解决方案的一些观察:

  1. 模式结尾处的“ u”表示该 模式 (而不是它匹配的文本)将被解释为UTF-8(我想您假设是后者?)。
  2. \ w与下划线字符匹配。您特别将其包括在文件中,这导致您假设您不希望它们出现在URL中,但是在代码中您拥有的URL将被允许包含下划线。
  3. 包含“外国UTF-8”似乎取决于语言环境。目前尚不清楚这是服务器还是客户端的语言环境。从PHP文档:

“单词”字符是任何字母或数字或下划线字符,即可以作为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

2020-05-26