在添加到数据库之前检查现有URL

时间:2011-06-01 13:53:44

标签: php url

我正在尝试测试用户表单字段中的现有网址是否需要一些指导。我是一名安置学生并告诉我正在工作的地方我对PHP不太满意,而且我在这里使用PHP。

这看起来是我迄今为止尝试过的最好的:

    $file = [url];
    $file_headers = @get_headers($file);
    if($file_headers[0] == 'HTTP/1.1 404 Not Found') {
         $exists = false;
    }
    else {
         $exists = true;
    }


    if ($_POST[code] == '') {
        header("Location: index.php"); 
        exit;
    }
    else if ($exists == false){
        print("URL is not valid");

    } 
    else {

        $query = "INSERT INTO redirects
        SET code = '$_POST[code]',
        url  = '$_POST[url]',
        requester = '$_POST[requester]',
        date = '$_POST[iw_start]',
        webperson = '$_POST[webperson]',
        active = '$_POST[active]'";

        mysql_query ($query, $link);

    }

>

我是在正确的道路上吗?

*在你回答之前:SQL查询不是我的。请保持谨慎。

4 个答案:

答案 0 :(得分:0)

您应该使用CURL来测试现有网址。

来自How can one check to see if a remote file exists using PHP?

$ch = curl_init($_POST[url]);

curl_setopt($ch, CURLOPT_NOBODY, true);
curl_exec($ch);
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// $retcode > 400 -> not found, $retcode = 200, found.
curl_close($ch);

然后,对于您的数据库,您应该添加一个唯一约束,以避免添加重复的URL。

现在,正如评论中提到的,你所做的是易受SQL注入攻击。用户可以通过表单发布恶意数据,例如,删除数据库中的所有条目。您必须保护从用户收到的输入数据(POST / GET),始终

答案 1 :(得分:0)

如果您阅读本手册,get_headers会在失败时返回false,因此我还会在检查HTTP状态代码之前检查它。

此外,您还没有在SQL查询中转义任何变量。

答案 2 :(得分:0)

尝试用以下内容替换您的查询:

$query = "INSERT INTO redirects
        SET code = '" . mysql_real_escape_string($_POST['code']) . "',
        url  = '" . mysql_real_escape_string($_POST['url']) . "',
        requester = '" . mysql_real_escape_string($_POST['requester']) . "',
        date = '" . mysql_real_escape_string($_POST['iw_start']) . "',
        webperson = '" . mysql_real_escape_string($_POST['webperson']) . "',
        active = '" . mysql_real_escape_string($_POST['active']) . "'";

答案 3 :(得分:0)

也许尝试使用正则表达式模式来确定它是否是有效的URL?

$valid = "/^(http://|https://)(([a-z0-9]([-a-z0-9]*[a-z0-9]+)?){1,63}\.)+[a-z]{2,6}/";

if (preg_match($valid, $file)) { echo "OK" };