Url验证我的脚本

时间:2012-09-24 23:53:50

标签: php forms validation 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');

修改 对不起Erik在这里。 @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 */;

2 个答案:

答案 0 :(得分:1)

有几件事:

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

优秀。使用filter_input()是最佳做法。

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

这个位有几个问题:

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

    如果(strpos($网址,的 'http://')===假)     $ URL =“HTTP://'.$url;

  4. 这里有几件事:

    1. 始终在代码块周围使用花括号{}
    2. FILTER_VALIDATE_URL不会验证没有方案的网址。这意味着此代码是多余的,应该删除,因为通过filter_input()调用的任何网址都保证有一个方案(例如http://)。
    3. 仅检查http://,您不会考虑使用其他方案的网址,例如https://。不过,这并不是什么大问题,因为正如我上面所指出的那样,无论如何都应删除此代码块,这要归功于FILTER_VALIDATE_URL为您完成所有操作。

      $ query =“INSERT INTO aa_aaarticle VALUES('','”。$ url。“','”。$ _ POST ['description']。“','” 。$ _ POST [ '类型'] “”,NOW());”;

    4. 这对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');
      

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

答案 1 :(得分:0)

我不知道这是否是您的错误,但根据您的表格布局,您需要更改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。