【问题标题】:Url Validating my scriptUrl 验证我的脚本
【发布时间】:2012-09-24 23:53:49
【问题描述】:

我对正确验证我的 URL 感到非常困惑。我已经尝试了几个选项,但我无法做到正确。有人可以查看我的代码并告诉我我做错了什么吗?

$url=filter_input(INPUT_GET, 'url', FILTER_VALIDATE_URL); 
if (!$url) {
    echo The url address is not valid
}

if(strpos($url,'http://')===false)
    $url='http://'.$url;
$query="INSERT INTO `aa_aa`.`article` VALUES ('', '".$url."', '".$_POST['description']."', '".$_POST['type']."',NOW());";
$result=mysql_query($query);
if(!$result)
    // echo 'Error While Inserting Article!';
    echo $query;
else
    header('Location: http://aa.aa');

编辑 对不起,埃里克在这里。 @Brad 我的朋友帮我编写了所有脚本,所以我不太了解我使用它的风险。

 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
 SET time_zone = "+00:00";


 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
 /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
 /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
 /*!40101 SET NAMES utf8 */;

 --
 -- Database: 
 --

 -- --------------------------------------------------------


 -- Table structure for table `article`
 --

 CREATE TABLE IF NOT EXISTS `article` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `url` varchar(100) NOT NULL,
   `description` text NOT NULL,
   `type` varchar(40) NOT NULL,
   `title` varchar(80) NOT NULL,
   `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   PRIMARY KEY (`id`),
   UNIQUE KEY `id` (`id`)
 ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=137 ;

 /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
 /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
 /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

【问题讨论】:

  • 您对 SQL 注入完全开放。如果您还没有被黑客入侵,那么您将会被黑客入侵。学习使用 PDO 或类似的准备好的查询来完全避免这个问题。
  • 你能提供你的表格布局/创建脚本吗?
  • @TylinJumfit .. 不是 html,我想知道您的 mysql 表是什么样的...请编辑您的问题,而不是在 cmets 中添加其他信息。
  • 好吧,Erik 抱歉。

标签: php forms validation url


【解决方案1】:

几件事:

$url=filter_input(INPUT_GET, 'url', FILTER_VALIDATE_URL); 

非常好。使用filter_input() 是最佳做法。

if (!$url) {
    echo The url address is not valid
}

这个位有几个问题:

  1. 当您专门检查值FALSE 时,养成使用$foo === FALSE 而不是!$foo 的习惯,除非检查的值保证为布尔值。在这种特殊情况下,我认为没有任何有效的 URL 可以被强制转换为布尔值 FALSE,因此您可能是安全的,但养成这个习惯仍然是件好事。李>
  2. 您回显的字符串缺少引号和终止分号,因此会产生语法错误。
  3. 没有什么能阻止脚本继续执行。这意味着无效的 URL 仍在进入您的数据库。您应该在echo 之后使用exit;,或者重组您的逻辑,以便您的错误条件实际上可以防止添加无效的 URL 并阻止脚本继续执行。

    if(strpos($url,'http://')===false) $url='http://'.$url;

这里还有几件事:

  1. 始终在代码块周围使用花括号 {}
  2. FILTER_VALIDATE_URL 不会验证没有方案的 URL。这意味着这段代码是多余的,应该删除,因为任何通过 filter_input() 调用的 URL 都保证有一个方案(例如 http://)。
  3. 通过仅检查 http://,您没有考虑使用其他方案的 URL,例如 https://。不过,这没什么大不了的,因为正如我在上面指出的那样,无论如何都应该删除这个代码块,这要感谢FILTER_VALIDATE_URL 为您处理这一切。

    $query="INSERT INTO aa_aa.article VALUES ('', '".$url."', '".$_POST['description']."', '".$_POST[ '类型']."',NOW());";

这对 SQL 注入很开放。永远不要将用户输入直接嵌入到您的查询字符串中。尽可能使用参数绑定和准备好的语句。由于您使用的是Mysql 扩展,因此这是不可能的,您最好的选择是使用mysql_real_escape_string()

$result=mysql_query($query);

Mysql 扩展名已弃用。您应该改用PDOMysqli

if(!$result)
    // echo 'Error While Inserting Article!';
    echo $query;
else
    header('Location: http://aa.aa');

同样,始终在代码块周围使用花括号 {}

【讨论】:

    【解决方案2】:

    我不知道这是否完全是您的错误,但根据您的表格布局,您需要更改 sql 查询

    "INSERT INTO `aa_aa`.`article` VALUES ('', '".$url."', '".$_POST['description']."', '".$_POST['type']."',NOW());"
    

    "INSERT INTO aa_aa.article 
      (url,description,type,title,time) 
    VALUES 
      ('". mysql_real_escape_string($url). "', 
       '". mysql_real_escape_string($_POST['description']). "', 
       '". mysql_real_escape_string($_POST['type']). "', 
       '". mysql_real_escape_string($_POST['title']). "',
       NOW())"
    

    请注意,我编造了$_POST['title'],因为它在原始查询中丢失但出现在表创建脚本中。此外,您确实必须使用mysql_real_escape_string 来获得一定程度的安全性。理想情况下,您会想要使用 PDO。

    【讨论】:

    • Nope 没有用,但我更担心这个安全问题。也许我应该花钱请人重写所有内容,而不是去找我的伙伴。
    • 是的,看起来您的朋友要么不知道他们提供给您的代码的安全隐患,要么他们希望暴露您的网站。
    猜你喜欢
    • 1970-01-01
    • 2011-07-18
    • 2021-03-04
    • 2011-11-15
    • 1970-01-01
    • 2016-07-02
    • 2017-05-26
    相关资源
    最近更新 更多