2014-02-10 3 views
0

Я новичок в заявлениях PDO, и это моя первая попытка. Я не совсем уверен, что код, который я произвел, что-то добивается?Моя первая попытка заявлений PDO - действительно ли этот код правильный и что он должен делать?

Я защищен от геймеров-кодировщиков?

<?php 
$host = "localhost"; 
$db = "test"; 
$user = "root"; 
$pass = "admin"; 

$who = '65'; 

$conn = new PDO("mysql:host=$host;dbname=$db",$user,$pass); 

$sql = "SELECT 

     tbl_tracking.id as trackID, 
     tbl_tracking.from_user as trackFROM, 
     tbl_tracking.viewed as trackVIEWED, 
     tbl_tracking.date as trackDATE, 

     tbl_users.id as usrID, 
     tbl_users.name as usrNAME, 

     tbl_photos.profile as photosPROFILE, 
     tbl_photos.photo_link as photoLINK, 
     tbl_photos.default_photo as photoDEFAULT 

     FROM tbl_tracking 
     LEFT JOIN tbl_users ON tbl_tracking.from_user = tbl_users.id 

     LEFT JOIN tbl_photos ON tbl_photos.profile = tbl_users.id 

     WHERE tbl_tracking.viewed = '$who' AND tbl_photos.default_photo IS NULL OR tbl_photos.default_photo = '1' 
     GROUP BY tbl_tracking.from_user 
     ORDER BY tbl_tracking.id DESC 
     LIMIT 9 
     "; 
$q = $conn->query($sql) or die("failed!"); 
while($r = $q->fetch(PDO::FETCH_ASSOC)){ 
echo '<a href="../profile/index.php?user=' . $r['usrID'] . '"><img src="../assets/uploads/thumbnail_' . $r['photoLINK'] . '" class="suggestUser" /></a>'; 
} 
?> 
+0

Он показывал строки в последнем 'while' сообщении? Какой результат? Трудно сказать, какие проблемы у вас есть, не видя ваших результатов. – tinlyx

+0

или зная, чего вы хотите достичь, для чего важно –

+0

Мое кодирование дает правильные результаты, я просто хочу убедиться, что способ, которым он написан, защищает меня от инъекций sql, хакеров и т. Д. Недавно я читал, что у парня был PDO'd его код, но он все еще был уязвим. Для меня это совсем ново. –

ответ

1

Для защиты от SQL-инъекции вы должны использовать новые подтверждающие значения PDO: параметры привязки. Это необходимо, что ваш подготовить заявления вместо того, чтобы работать с ними напрямую:

$q = $conn->prepare($sql); // the default way of PDO to manage errors is quite the same as `or die()` so no need for that 

Измените ваш где положение:

WHERE tbl_tracking.viewed = :who AND tbl_photos.default_photo IS NULL OR tbl_photos.default_photo = '1' 

затем привязать значение к выписке и выполнить его:

$q->bindValue(':who',$who,PDO::PARAM_INT); 
$q->execute(); 

или вы можете выполнить его непосредственно с помощью массива значений:

$q->execute(array(':who' => $who)); 

В противном случае я не очень уверен, что ваш код должен делать, поэтому я не могу сказать, будет ли это делать, но если ваш sql работал до использования PDO, он тоже должен работать.

Для того чтобы ваш код был подвержен внедрению sql, одно из значений в вашем запросе должно иметь способ ввода из пользовательского ввода, и его необходимо передать как-есть в PDO prepare(). Поскольку мы используем параметр :who вместо $who, то ваш код sql не будет подготовлен с опасными значениями.

+0

Я добавил данные, которые вы сказали для защиты, и обновил мой код здесь. Код дает правильный результат, но, глядя на мой код сейчас, все ли кошерное и не позволяет хакеру бесплатно? –

+0

oh. sry, я помещаю 'PARAM_STR', но снова смотрю на ваш код, это INT, поэтому он должен быть' PARAM_INT'. обновил мой ответ. Что касается бесплатного хакера, единственным входом, который поступает от переменной в вашем запросе, является '$ who', и он параметризирован, поэтому это должно быть хорошо. –

Смежные вопросы