【问题标题】:Sanitize form field [closed]清理表单字段[关闭]
【发布时间】:2014-06-21 03:48:25
【问题描述】:

我有一个表单字段,我们允许用户在其中发布一个 Youtube URL(显然有很多 youtube 类型的 url 变体)

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

  1. 非 youtube 网址。
  2. 繁重的漏洞攻击包括无关代码和 URL。

我读了这篇文章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>

【问题讨论】:

  • 在 PHP 中,您可以将 filter_var()FILTER_VALIDATE_URLSANITIZE_ 一起使用,但需要额外的正则表达式/字符串检查来断言它指向 youtube。
  • 谢谢马里奥,不知道为什么我的帖子被否决了,如果我能在我的问题中添加更多内容。关于你的回复会有一个搜索结果。谢谢,投了赞成票

标签: php regex


【解决方案1】:

因此,您可以在$_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 函数,可以很好地执行操作。

您可能需要根据您的用户可能输入的 URL 稍微调整它(例如,我不知道 YouTube 是否有更多域/虚拟主机 - 这可以通过创建 array() 轻松解决并用in_array()等检查它)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢 Botteknotten,我会派一个球探来看看我能想出什么。
    • “始终在应用程序的服务器端进行验证。”或者两者兼而有之,这样您就可以覆盖并区分最初入侵表单的人与提交时的意外/无意错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 2010-12-24
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多