Php 验证我的脚本的Url

Php 验证我的脚本的Url,php,forms,validation,url,Php,Forms,Validation,Url,我很困惑如何正确验证我的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

我很困惑如何正确验证我的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查询

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

请注意,我编写了
$\u POST['title']
,因为它在原始查询中丢失,但出现在表创建脚本中。此外,您还必须使用
mysql\u real\u escape\u string
来实现一定程度的安全性。理想情况下,您希望使用PDO。

以下几点:

$url=filter_input(INPUT_GET, 'url', FILTER_VALIDATE_URL); 
这是极好的。使用
filter\u input()
是最佳实践

if (!$url) {
    echo The url address is not valid
}
这个钻头有几个问题:

  • 养成使用
    $foo===FALSE而不是
    的习惯$foo
    当您专门检查值
    FALSE
    时,除非所检查的值保证为布尔值。在这种特殊情况下,我不相信有任何有效的URL可以强制为布尔值
    FALSE
    ,因此您可能是安全的,但养成这种习惯还是好的
  • 您要回显的字符串缺少引号和终止分号,因此这些将产生语法错误
  • 没有任何内容阻止脚本继续。这意味着无效URL仍在进入数据库。您应该使用
    exitecho
    之后执行code>,或者重新构造逻辑,以使错误条件实际上可以防止添加无效URL和继续执行脚本

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

  • 这里还有几件事:

  • 始终在代码块周围使用大括号
    {}
  • FILTER\u VALIDATE\u URL
    不会验证没有方案的URL。这意味着此代码是多余的,应该删除,因为任何通过
    过滤器\u input()
    调用的URL都保证有一个方案(例如
    http://
  • 通过只检查
    http://
    ,您没有考虑使用其他方案的URL,例如
    https://
    。不过,这并不是什么大问题,因为正如我在上面指出的,由于
    FILTER\u VALIDATE\u URL
    为您解决了所有问题,所以无论如何都应该删除这个代码块

    $query=“插入
    aa_-aa
    文章
    值(''''.''.$url'.','.'.'.'.'.''.'.'.'.'.'.'.'.'.''.'.'.'.'.'.'.''.'.'.''.'.''.'.'.''.'.'.''.'.'.'

  • 这对SQL注入是完全开放的。永远不要直接将用户输入嵌入查询字符串。尽可能使用参数绑定和准备好的语句。因为您使用的是
    Mysql
    扩展,所以这是不可能的,最好的选择是使用

    Mysql
    扩展已被弃用。你应该使用or


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

    您对SQL注入非常开放。如果你还没有被黑客攻击过,你会被黑客攻击的。学习将准备好的查询与PDO或类似工具一起使用,以完全避免此问题。能否提供表布局/创建脚本?@TylinJumfit。。不是html,我想知道你的mysql表是什么样子。。。请编辑您的问题,而不是在评论中添加额外的信息。好吧,Erik,对此表示抱歉。没有,但我更担心这个安全问题。也许我应该付钱给某人重写所有内容,而不是去找我的朋友。是的,看起来你的朋友要么不知道他们提供给你的代码的安全含义,要么他们希望你的网站被公开。
    if (!$url) {
        echo The url address is not valid
    }
    
    $result=mysql_query($query);
    
    if(!$result)
        // echo 'Error While Inserting Article!';
        echo $query;
    else
        header('Location: http://aa.aa');