Очистить HTML в запросе SQL с помощью функции PHP

0

Таким образом, у меня есть страница PHP с раскрывающимся списком, которая, когда выбрана опция, использует сценарий AJAX для запроса результата из той же таблицы MySQL. По большей части он работает, как и ожидалось. Однако некоторые результаты (в частности, параметры, которые имеют "или" в названии) неправильно настраиваются для переменной сценария AJAX/GET. Вот мой основной скрипт PHP:

<html>
 <head>
  <link rel="stylesheet" type="text/css" href="css/styles.css" media="screen" />
  <title>Add Inventory</title>
  <script>
function showUser(str)
{
if (str=="")
  {
  document.getElementById("txtHint").innerHTML="";
  return;
  } 
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","getsku.php?q="+str,true);
xmlhttp.send();
}
</script>
 </head>
 <body>
<?php
session_start();

require_once('includes/config.inc.php');
require_once('includes/functions.inc.php');

// Check login status -- if not logged in, redirect to login screen
if (check_login_status() == false) {
  redirect('login.php');
}
$thisPage='add';
include('includes/navbar.inc.php');
?>

<h1>Add New Inventory Record</h1>
<form method="POST" action="submitadd.php" />

<table id="add">

<tr>
<td class="headings"><b>Species:</b></td>
<td><select name="species:" onchange="showUser(this.value)">
      <option value="select">Choose a Species</option>
      <?php
      $prodquery="SELECT name FROM products ORDER BY name ASC";
      $result=mysqli_query($con,$prodquery) or die(mysqli_error($con));
      while ($row = mysqli_fetch_array($result)) {
        echo "<option value='" . $row['name'] . "'>" . $row['name'] . "</option>";
      }
      ?>
    </select>
</td>
</tr>

<div id='txtHint' />

<tr>
<td class="headings"><b>Fry Count:</b></td>
<td><input type="text" name="frycount" value="<?php echo $row['quantityfry']; ?>" size="35" maxlength="4" /></td>
</tr>

<tr>
<td class="headings"><b>Juvie Count:</b></td>
<td><input type="text" name="juviecount" value="<?php echo $row['quantityjuv']; ?>" size="35" maxlength="4" /></td>
</tr>

<tr>
<td class="headings"><b>Adult Count:</b></td>
<td><input type="text" name="adultcount" value="<?php echo $row['quantityadult']; ?>" size="35" maxlength="4" /></td>
</tr>

<tr>
<td class="headings"><b>Notes:</b></td>
<td><input type="text" name="notes" value="<?php echo $row['notes']; ?>" size="35" maxlength="255" /></td>
</tr>

<tr>
<td class="headings"><b>Location:</b></td>
<td><select name="location">
  <?php
  $options = set_and_enum_values($con, 'inventory', 'location');
  foreach($options as $option):
?>
    <option><?php echo $option ?></option>
<?php endforeach; ?>
</select></td>
</tr>

<tr>
<td class="headings"><b>Owner:</b></td>
<td><select name="owner">
<?php
  $options = set_and_enum_values($con, 'inventory', 'owner');
  foreach($options as $option):
?>
    <option><?php echo $option ?></option>
<?php endforeach; ?>
</select></td>
</tr>

</table>
<br />
<input type="submit" name="submit" value="submit" class="button1" />
</form>

</body>
</html>

И вот getku.php, который вызывается скриптом AJAX:

<?php
$q = html_entity_decode($_GET['q']);

require_once('includes/config.inc.php');

$sql="SELECT sku FROM products WHERE name = '".$q."'";

$result = mysqli_query($con,$sql);

while($row = mysqli_fetch_array($result))
  {
  echo "<td><input type='hidden' name='sku' value='" . $row['sku'] . "' readonly='readonly' size='35' /></td>";
  }

mysqli_close($con);
?>

Я тестировал в Firebug, и вот конкретный пример. Ряд данных: name = Lethrinops albus "Kande Island" sku = HAP002

Есть и другие данные, но не беспокойство по этому поводу. Поэтому, когда выпадающий Lethrinops albus "Kande Island" выбирает Lethrinops albus "Kande Island", я хочу, чтобы HAP002 установлен в скрытое поле и передан в кнопку отправки в этой форме. Используя Firebug, я вижу это под Params: q Lethrinops albus "Kande Island"

Что правильно. Вот еще одна строка данных: name = Cynotilapia afra "Lion Cove" sku = MBN002

Но в Firebug я вижу это под Params: q Cynotilapia afra "Lion

Это неверно. Я предполагаю, что мне нужно дезинфицировать результат HTML, и я нашел функцию, которая может помочь:

function htmlsan($htmlsanitize){
return $htmlsanitize = htmlspecialchars($htmlsanitize, ENT_QUOTES, 'UTF-8');
}

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

Теги:
function
sanitize

2 ответа

1

Прежде всего, вы никогда не должны строить SQL-запрос таким образом:

$q = html_entity_decode($_GET['q']);
$sql="SELECT sku FROM products WHERE name = '".$q."'";

Это не очень хорошая практика, и есть такие проблемы безопасности, как SQL Injection
Чтобы решить все ваши проблемы с санацией (и многие другие), я рекомендую использовать PHP Data Objects (PDO) для всех ваших SQL-соединений.
Особенно взгляните на этот ответ. Как я могу предотвратить SQL-инъекцию в PHP?
Используйте эту функцию mysql-real-escape-string.php для дезинфекции входных данных в MySQL-запросе.

[EDITED] Ответьте на свой вопрос.
Проблема не в вашем SQL-запросе. Это <option value='problem is here!'>.

Вы должны использовать htmlentities, чтобы правильно избежать одиночной кавычки, когда name = Cynotilapia afra "Lion Cove".

echo "<option value='" . htmlentities($row['name']) . "'>" . $row['name'] . "</option>";

Возможно, вам понадобится использовать html_entity_decode для декодирования (обратная операция) в файле getsku.php.

  • 0
    +1 за предложение PDO и ссылки для инъекций.
  • 0
    Да, я знаю, что мне нужно избегать моих запросов SQL и стыдно, что я еще не сделал. Я почти не знаю mysqli_ * и ничего не знаю о PDO. Поскольку это внутреннее приложение для 3-4 пользователей, я согласен с ним, чтобы оно заработало. Как только функциональность есть, я возвращаюсь назад, защищаю ее и делаю ее красивой. Я не следую вашему решению, хотя. Я попытался добавить эту строку в getsku.php, но у меня такое же поведение. Основываясь на моих сценариях выше, будет ли правильная строка данных вообще извлечена для начала? Как, где в моем сценарии это выдумка?
Показать ещё 1 комментарий
0

Поскольку вы передаете данные с помощью GET вам нужно urlencode() чтобы передать их на следующую страницу. Не расшифровывайте их в следующем скрипте. Суперглобалы уже декодированы.

После того, как вы входите в следующий скрипт, вы должны использовать свои функции расширения DB для использования параметра $_GET в вашем SQL-запросе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню