消毒形式领域

时间:2014-05-04 22:39:18

标签: php regex

我有一个表单字段,我们允许用户发布Youtube网址(显然有很多youtube类型网址变体)

我的问题是,我们如何清理这个元素,以防止用户发布:

  1. 非youtube网址。
  2. 繁琐的漏洞攻击无关的代码和网址。
  3. 我读过这篇文章here

    但我对如何实施Jeff Attwood给出的答案感到有些困惑。

    目前我的表单元素很简单。

    <div class="form-group col-lg-6 col-sm-12 underline">
    <label>Add a Video from <strong>YouTube</strong></label>
    <input type="text" name="video" id="choosevideo" class="form-control" tabindex="6" placeholder="YouTube Video URL">
    </div>
    

2 个答案:

答案 0 :(得分:3)

您不应该依赖客户端验证,因为它很容易跳过。始终在应用程序的服务器端验证。

找到适合的regex并将其添加到您的服务器验证中。如果您还想要客户端验证,可以在输入标记中添加“pattern”属性。

答案 1 :(得分:0)

因此,您可以在$_POST['video']中获取用户数据,就像您的表单所示。

您应该从PHP的parse_url()函数开始,然后使用parse_str()函数。

适合您的工作示例。根据您的需求进行定制:

<?php

$parse = parse_url($_POST['video']);

if ($parse['host'] != 'www.youtube.com'){
   echo 'this is not a valid url';
   // return false here or something
}

// continue only if false was not returned, of course

parse_str($parse['query'], $query);

if (!isset($query['v']) || !$query['v']){
   echo 'you have not provided a video id';
   // return false here
}

// if false was not returned up until this point,
// you have the video ID in $query['v']
// and that is all you need I believe

// I think you can do the rest

?>

在我看来,这是最好的做法,我不明白为什么人们建议正则表达式或类似的。这种方法快速,安全,并使用内置的PHP函数,可以很好地执行操作。

根据您的用户可能输入的网址,您可能需要稍微根据需要进行调整(例如,我不知道YouTube是否有更多的域名/虚拟主机 - 这可以通过创建{{1并使用array()等检查它。)