是否使用PDO预处理语句和htmlspecialchars足以阻止XSS和SQL注入?

时间:2017-05-13 18:19:05

标签: php pdo

例如,在此代码中,htmlspecialchar是否阻止了XSS,是否是防止SQL注入的PDO预处理语句?

if(isset($_GET['search']) AND !empty($_GET['search']) AND $_GET['search'] != ' ') {
    $search = htmlspecialchars($_GET['search']);
    $searchArray = explode(' ',$search);
    var_dump($searchArray);

    $videos = $stdb->prepare('SELECT id, title, videoTime FROM videos WHERE title LIKE "%'.$search.'%" OR title LIKE "%'.implode("\" OR title LIKE \"%", $searchArray).'%" ORDER BY id DESC limit '.$start.','.$videosPerPage);
    $videos->execute();
    $totalVideos = $totalVideosReq->rowcount();
    $totalPages = ceil($totalVideos/$videosPerPage);

    $currentPage = 1;
    if(isset($_GET['page']) AND !empty($_GET['page']) AND $_GET['page'] > 0 AND $_GET['page'] <= $totalPages) {
        $_GET['page'] = intval($_GET['page']);
        $currentPage = $_GET['page'];
    } else{
        $currentPage = 1;
    }
}

1 个答案:

答案 0 :(得分:3)

您正在调用prepare(),但只是调用prepare()并不是防止SQL注入的神奇方法。

您仍在将不安全的请求数据复制到SQL查询中,而不使用参数。这就是SQL注入的过程。

保护是使用参数。这还要求您使用prepare()execute(),但您应该了解的是,它是保护您的参数化,而不是prepare()

我希望您理解这一点,我建议您不要将您的代码放在任何公共网站上,直到您理解它为止。

阅读How can prepared statements protect from SQL injection attacks?

接受的答案中的良好说明

P.S。:您还在使用htmlspecialchars()。这不是针对SQL注入的保护。使用htmlspecialchars()有助于防范不同的安全风险跨站点脚本,但是当您想要回显输出时,而不是在编写SQL查询时,请执行此操作。< / p>