我很困惑,无法正确验证我的网址。我尝试了一些选项,但我无法做到。有人可以查看我的代码并告诉我我做错了什么吗?
$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 */;
答案 0 :(得分:1)
有几件事:
$url=filter_input(INPUT_GET, 'url', FILTER_VALIDATE_URL);
优秀。使用filter_input()
是最佳做法。
if (!$url) {
echo The url address is not valid
}
这个位有几个问题:
$foo === FALSE
时,养成使用!$foo
而不是FALSE
的习惯,除非检查的值保证是布尔值。在这种特殊情况下,我不相信有任何有效的URL可以被强制转换为布尔FALSE
,所以你可能安全,但是养成习惯仍然很好。 没有什么能阻止脚本继续运行。这意味着无效的URL仍在进入您的数据库。您应该在exit;
之后使用echo
,或重构您的逻辑,以便您的错误条件实际上阻止添加无效网址并继续使用脚本。
如果(strpos($网址,的 'http://')===假) $ URL =“HTTP://'.$url;
这里有几件事:
{}
。FILTER_VALIDATE_URL
不会验证没有方案的网址。这意味着此代码是多余的,应该删除,因为通过filter_input()
调用的任何网址都保证有一个方案(例如http://
)。仅检查http://
,您不会考虑使用其他方案的网址,例如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
扩展程序。您应该使用PDO
或Mysqli
代替。
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。