例如,在此代码中,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;
}
}
答案 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>