首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL撇号导致web爬虫上的错误描述

SQL撇号导致web爬虫上的错误描述
EN

Stack Overflow用户
提问于 2017-01-18 22:37:14
回答 1查看 29关注 0票数 0

我一直在研究网络爬虫。让我来描述一下这个问题。

假设web爬虫将标题读取为堆栈溢出(当您放置url http://stackoverflow.com时)

下面是错误的部分,假设页面的元描述是:

贾森的堆栈溢出是最大的在线社区的程序员学习,分享他们的知识,并推进他们的职业生涯。

每当我运行我的爬虫时,只要它看到撇号,它就会停止并且只爬行直到Jason。因此,整个描述如下:

杰森

这是爬虫的密码。告诉我出了什么问题,希望如何解决,因为这让我发疯了。我错过了一些超小的东西..。

代码语言:javascript
运行
复制
foreach($url as $k) {
$url = parse_url($k);
if(!isset($url['path'])) {
    $selectData = "SELECT * FROM web WHERE url = '$k'";
    if(mysql_fetch_row(mysql_query($selectData)) === false) {
        $content = getUrl($k);
        preg_match('#<title>(.*)</title>#i', $content, $title);
        preg_match_all('/<img src=.([`^"\']+)/', $content, $img);
        preg_match('/<head>.+<meta name="description" content=.([`^"\']+)/is', $content, $description);
        preg_match('/<head>.+<meta name="author" content=.([`^"\']+)/is', $content, $author);
        #preg_match_all('/href=.([`^"\']+)/i', $content, $anchor);
        preg_match('/<body.*?>(.*?)<\/body>/is', $content, $body);
        if(!empty($title[1])  AND !empty($description[1]) || !empty($body[1])) {
            echo 'Titlu: '; @print_r($title[1]);
            echo "\n";
            $body_trim = trim(preg_replace("/&#?[a-z0-9]+;/i",'',(strip_tags(@$body[0])))); $bodyContent = substr(preg_replace('/\s+/', ' ', $body_trim), 0, 255);

            $description_trim = trim(preg_replace("/&#?[a-z0-9]+;/i",'',(strip_tags(@$description[1])))); $descContent = substr(preg_replace('/\s+/', ' ',$description_trim), 0, 255);

            $bodyContent = str_replace('\'', '', $bodyContent);
            $descContent = str_replace('\'', '', $descContent);

            echo 'Description: '; @print_r($descContent);
            echo "\n";
            echo 'Author: '; @print_r($author[1]);
            echo "\n";
            echo 'URL: '; @print_r($k); $date = date("d M Y");
            echo "\n";
            echo "\n---------------------------------------------------------------------------\n";
            $insertData = "INSERT INTO `web` (`url` ,  `title` ,  `description` ,  `body` ,  `author`, `date`) VALUES ('".$k."', '".@$title[1]."', '".@$descContent."', '".@$bodyContent."', '".@$author[1]."', '".$date."')";
            #echo $insertData;
            mysql_query($insertData);
        }
    }
}
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-18 22:53:41

您得到了精确的SQL -注入情况,因为您将输入值连接到SQL字符串中。

代码语言:javascript
运行
复制
... VALUES ('".$k."', '".@$title[1]."'...

也许@$title1有‘like: it’s SQL Injection‘它会导致SQL语法错误,因为最终的SQL查询字符串看起来像

代码语言:javascript
运行
复制
VALUES ('something', 'It's SQL Injection', ...

实际上,您得到了SQL语法错误。

正如@Bramar所说--使用带有参数的预准备语句。它将保证您不受实际SQL注入的影响,并将正确处理值中的任何SQL保留字符。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41730717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档