【问题标题】:PHP strpos validationPHP strpos 验证
【发布时间】:2016-04-16 20:40:45
【问题描述】:

我正在使用 strpos 函数来验证用户提交的 url,并且我想确保我没有遗漏任何允许用户绕过验证并提交不适当的 url 的内容。

以以下为例,如果我只希望用户能够输入与 youtube 域关联的 url,我不希望他们能够在其中放置通配符 (*) 或其他内容“欺骗” strpos 函数。

$url = $request->input('url');

// Check if Youtube url is found

if (strpos($url, 'http://youtube.com') > -1)
{
    // some code    
}

// some code

谢谢!

【问题讨论】:

  • 您还必须考虑 URL 缩短器

标签: php


【解决方案1】:

strpos 在未找到的情况下返回 false,如果字符串出现在第一列,则返回 0,这在 PHP 中也类似于 false,因此使用 === 或 @ 会更准确987654325@

$url = $request->input('url');
// Check if Youtube url is found

if (strpos($url, 'http://youtube.com') !== FALSE)
{
    // some code when youtube is found in url
}

【讨论】:

    【解决方案2】:

    最好使用正则表达式。

    ^(https?\:\/\/)?(www\.)?(youtube\.com|youtu\.?be)\/.+$
    

    试试看。

    【讨论】:

    • 巨大的锤子可以打碎花生
    • 跟进@andrewsi 对该问题的评论。
    • 那么其他 1000 个可能的 URL 缩短器呢
    • 好吧,我认为 OP 并不关心这一点。这个建议是有效的,youtu.be 是 youtube 的官方缩短器。它归Alphabet所有。这样的仇恨..
    • 没有仇恨,只是提前思考。我不同意正则表达式是所有事情的解决方案,当一个简单的 strpos 或类似的方法可以做到时,没有必要加载整个正则表达式引擎。吻。是我的口头禅
    【解决方案3】:

    记得使用类型安全方程进行测试。

    strpos 将找到字符串中第一次出现的位置。所以 如果字符串开头有匹配项(位置 0)

    if (strpos($url, 'http://youtube.com') > -1)
    

    将返回 0,它将被解释为 false。你有麻烦了。

    相反,请安全地输入:

    if (strpos($url, 'http://youtube.com') !== false)
    

    这意味着无论在字符串中的哪个位置找到您的子字符串,它都会被认为是正确的,并且您知道存在匹配项。

    【讨论】:

    • 否,strpos 返回第一次出现的位置,或返回boolean false。所以我们真的只需要知道它是否是假的。在其他所有情况下,它对我们来说都是“真实的”,即大海捞针的位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多