当前位置: 首页 > 面试题库 >

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

宓和同
2023-03-14
问题内容

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

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


问题答案:

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

  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



 类似资料:
  • 问题内容: 我正在寻找一个可以清理字符串并准备好用于文件名的php函数。有人知道吗? (我会写一个,但是我担心自己会忽略一个字符!) 编辑:用于将文件保存在Windows NTFS文件系统上。 问题答案: 不用担心忽略字符-如何使用您愿意使用的字符白名单?例如,你可以让刚刚好醇” ,,,和一段时间的单个实例()。这显然比大多数文件系统要严格得多,但应该可以确保您的安全。

  • 问题内容: 我正在从外部进程接收字符串。我想使用该字符串创建文件名,然后写入该文件。这是执行此操作的代码段: 如果s包含无效字符,例如在基于Unix的OS中为’/’,则(正确)抛出java.io.FileNotFoundException。 如何安全地编码字符串,以便可以将其用作文件名? 编辑:我希望的是一个为我做的API调用。 我可以做这个: 但是我不确定URLEncoder是否可用于此目的。

  • 问题内容: 假设我有以下字符串: 是否有一些功能或模块可以将上述字符串转换为以下所有字符都更改为与url兼容的字符串: 在python中执行此操作的最佳方法是什么? 问题答案: Python 2的urllib.quote_plus和Python 3的urllib.parse.quote_plus 输出:

  • 问题 一些无聊的幼稚黑客在你的网站页面表单中输入文本”pýtĥöñ”,然后你想将这些字符清理掉。 解决方案 文本清理问题会涉及到包括文本解析与数据处理等一系列问题。 在非常简单的情形下,你可能会选择使用字符串函数(比如 str.upper() 和 str.lower() )将文本转为标准格式。 使用 str.replace() 或者 re.sub() 的简单替换操作能删除或者改变指定的字符序列。

  • 问题内容: 我通过通过PHP回显将XML文档发送给AJAX调用来进行响应。为了形成这个XML文档,我遍历了数据库的记录。问题在于数据库中包含带有’<’符号的记录。因此,浏览器自然会在该特定位置引发错误。如何解决? 问题答案: 通过使用(或可能更适当地)使用库来构建XML文档(例如DOMDocument或XMLWriter)来转义这些字符。 另一种替代方法是使用CDATA节,但是您必须注意是否出现。

  • 问题 你想清理字符串前后的空白符。 解决方案 使用 JavaScript 的正则表达式来替换空白符。 要清理字符串前后的空白符,可以使用以下代码: " padded string ".replace /^\s+|\s+$/g, "" # => 'padded string' 如果只想清理字符串前面的空白符,使用以下代码: " padded string ".replace /^\s+/g,