SQL-инъекций и работы PHP проверка


Я надеюсь, что это не очень плохой вопрос Для первый раз здесь новичок.

Этот фрагмент кода выбирает из левой таблицы и список содержимого в правой таблице. Это рабочий код, но я хотел бы увидеть, как профессионально защитить и сделать это быстрее.

Любое предложение (с кодом) будут оценены. Спасибо большое

ЗЫ: есть небольшой глюк с ним: после удаления его потерять выбранный элемент на правом список.

<?php include("db_con1.php");?>

<html>
<head>
</head>
<body>
<form method="post" action="test.php">

<div id="left">
<?php
  $queryl = $pdo->prepare('SELECT id, name FROM test1 ORDER BY name ASC');
  $queryl->execute();
?>

<ul>

  <?php foreach ($queryl as $i => $rowl) { ?>

  <li>
   <?php if ($i) {?>
  <input name="checkbox1_del[]" id="test_<?php echo $i ?>" type="checkbox" value="<? echo $rowl['id']; ?>"/>
  <label for="test_<?php echo $i ?>">
   <a href="test1.php?gid=<?php echo $rowl['id']; ?>"><?php echo $rowl['name']; ?></a>
  </label>
 </li>
  <?php } ?>
 </ul>
</div>

<div id="right">

<?php
  if(isset($_GET['gid'])) {
   $gid=$_GET['gid'];    
   $queryr = $pdo->prepare('SELECT test3.name FROM test1, test2, test3 WHERE test1.id=test2.groupid AND test3.id=test2.peopleid AND test1.id='.$gid.' ORDER BY test3.name ASC');
   $queryr->execute();
  }
?>

<ul>

  <?php foreach ($queryr as $i => $rowr) { ?>

    <li>
      <?php if ($i) {?>
      <input name="checkbox2_del[]" id="test_<?php echo $i ?>" type="checkbox" value="<? echo $rowr['id']; ?>"/>
      <label for="test_<?php echo $i ?>"><?php echo $rowr['name']; ?></label>
    </li>
  <?php } ?>
</ul>
</div>

<input type="submit" name="del" value="Delete the selected items">
</form>

<?php
if (isset($_POST['del'])) {
echo "Don't delete:)";
  for ($c = 0; $c < count($_POST['checkbox1_del']); $c++){
    $checkbox1_del = $_POST['checkbox1_del'][$c];
    $sql = 'UPDATE test1 SET status=0, log="'.date("Y-m-d").'"WHERE id='.$checkbox1_del;
    echo $sql;
    $query = $pdo->prepare($sql);
    $query->execute();
  }

  for ($c = 0; $c < count($_POST['checkbox2_del']); $c++){
    $checkbox2_del = $_POST['checkbox2_del'][$c];
    $sql = 'UPDATE test2 SET status=0, log="'.date("Y-m-d").'"WHERE id='.$checkbox2_del;
    echo $sql;
    $query = $pdo->prepare($sql);
    $query->execute();
   }

    if($query){
      echo "<meta http-equiv=\"refresh\" content=\"0;URL=test1.php\">";
     }
 }
?>

</body>
</html>

Пересмотреть 1: это-добытая частью моей программы, однако вот определение этой функции:

Имея 3-5000 контакт, для отправки электронных писем их легче группировать их в список рассылки. Так что эта часть программы обеспечивает 3 таблицы:

Список рассылки | члены выбранной группы | чел.

вы можете сделать название группы и добавлять людей в него.

Поэтому основные функции, которые я написал для этой части:

  • новый список рассылки может быть добавлен
  • При нажатии на любой список рассылки вы получите таблицу участников (переменная$_GET)
  • Также при нажатии на список рассылки должен быть жирным (класс="полужирный"), как описано
  • Выбирая элементы в списке членов могут быть удалены (checkbox2_del())
  • Из списка людей, кто может быть добавлена в список

Это то, что я пытался писать и этот тест показывает, что основные этапы его. Я просто не хочу перегружать любой, чтобы прочитать весь сценарий. Если кто-то хотел бы видеть меня счастливой, чтобы заменить его. Спасибо



388
2
задан 31 августа 2011 в 08:08 Источник Поделиться
Комментарии
1 ответ

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

$gid = $_GET['gid'];    
$queryr = $pdo->prepare('SELECT test3.name FROM test1, test2, test3 WHERE test1.id = test2.groupid AND test3.id = test2.peopleid AND test1.id = :gid ORDER BY test3.name ASC');
$queryr->bindParam(':gid', $gid, PDO::PARAM_STR);
$queryr->execute();

Предполагая, что ваш $гид должен быть числовым, вы должны, вероятно, извлечь его это слишком:

if(is_numeric($_GET['gid'])) {
$gid = (int)$_GET['gid'];
// ...
$queryr->bindParam(':gid', $gid, PDO::PARAM_INT);

То же самое касается ваших последующих запросов, которые формируются из $_POST, где.


Этот сегмент также отсутствует набор брекетов. Если это работает, то это скорее всего совпадение. если без подтяжки является достаточно трудно читать только в PHP, но если у вас выпадет на PHP, я честно не знаю, как PHP будет реагировать.

  <?php foreach ($queryl as $i => $rowl) { ?>

<li>
<?php if ($i)?> <!-- **** BRACES MISSING HERE? **** -->
<input name="checkbox_del[]" id="test_<?php echo $i ?>" type="checkbox" value="<? echo $rowl['id']; ?>"/>
<label for="test_<?php echo $i ?>">
<a href="test1.php?gid=<?php echo $rowl['id']; ?>"><?php echo $rowl['name']; ?></a>
</label>
</li>
<?php } ?>


Есть большая проблема с этим скриптом в целом. Смешивание логики с выхода может привести к проблемам дизайна. В идеале вы должны загрузить все ваши данные в верхнем, затем создать вашу страницу всем сразу. Я не знаю, как большой системы, но в целом гораздо проще управлять системой в целом, если вы структуры ваших страниц таким образом. Что произойдет, если вы хотите, чтобы условно показать что-то на верхней части страницы, но состояние не создается позже, когда вы обрабатываете данные?

Например, вы могли бы закончить с чем-то вроде следующего:

<?php 
include("db_con1.php");
$queryl = $pdo->prepare('SELECT id, name FROM test1 ORDER BY name ASC');
$queryl->execute();

$lists = array();
while (($rowl = $queryl->fetch(PDO::FETCH_ASSOC)) !== false) {
$lists[] = $rowl;
}

// And so on for all the data you need to load
?>
<html>
<head>
<!-- And so on... -->

Похоже ваши права-бар и бар слева не связаны напрямую, но если бы они были, то вы могли бы поставить еще в том, что в то время как цикл, чтобы загрузить вещи в $мага Warg прежде чем добавлять его в $списков. Затем вы можете просто перебрать этот массив в коде. Все ваши SQL-это в верхней части файла и легко изменить, все ваши презентации в конец файла и читать намного приятнее, тоже всего лишь несколько циклов и некоторые Эхо'ы.

5
ответ дан 31 августа 2011 в 09:08 Источник Поделиться