2016-08-07 2 views
0

Я использую MySQLi, чтобы предотвратить дальнейшие атаки на мой сайт. Я использую PHP 5.6.16, версию MySQL: 5.7.9 и с использованием WAMPPHP | Поиск пользователя и уязвимость для атак

У меня возникает следующая ошибка при поиске пользователя с некоторыми странными символами, например, добавление символа ') в поле поиска.

ошибка MySQL # 1064 и SQLI уязвимость

Как я могу дезинфицировать ввода текста и предотвратить любые странные или нераспознанных символов для поиска?

Скриншот:

Error Screenshoot

коды:

<?php 
# Essential files, please don't erase it! 
require_once("../functions.php"); 
require_once("../db-const.php"); 
session_start(); 
?> 
<html> 
<head> 

    <script src="script.js" type="text/javascript"></script><!-- put it on user area pages --> 
</head> 
<body> 
    <h1> View Profile </h1> 
<hr /> 
<?php 
if (logged_in() == false) { 
echo "<script> window.alert(\"Please login first!\"); </script>"; 
    redirect_to("login.php"); 
} else { 
    if (isset($_GET['username']) && $_GET['username'] != "") { 
     $username = $_GET['username']; 
    } else { 
     $username = $_SESSION['username']; 
    } 

    ## connect mysql server 
     $mysqli = new mysqli(localhost, root, "", loginsecure); 
     # check connection 
     if ($mysqli->connect_errno) { 
      echo "<p>MySQL error no {$mysqli->connect_errno} : {$mysqli->connect_error}</p>"; 
      exit(); 
     } 
    ## query database 
     # fetch data from mysql database 
     $sql = "SELECT * FROM users WHERE username ='".$username."' LIMIT 1"; 

     if ($result = $mysqli->query($sql)) { 
      $user = $result->fetch_array(); 
     } else { 
      echo "<p>MySQL error no {$mysqli->errno} : {$mysqli->error}</p>"; 
      exit(); 
     } 

     if ($result->num_rows == 1) { 
      # calculating online status 
      if (time() - $user['status'] <= (5*200)) { // 300 seconds = 5 minutes timeout 
       $status = "Yes"; 
      } else { 
       $status = "No"; 
      } 

      # echo the user profile data 
      echo "<title> View Profile of: {$user['username']} </title>"; 
      echo " Account Searcher: <br> 
      <form action=\"?username=\" method=\"get\"> 
      Unique ID: <input type=\"text\" name=\"username\" placeholder=\"Searching for user: {$_GET['username']}\"> 
      <input type=\"submit\" value=\"Search\"> 
      </form><hr> 
      "; 
      echo "Unique ID: {$user['id']}\n<br>Username: {$user['username']}\n<br>First Name: {$user['first_name']}\n<br>Last Name: {$user['last_name']}\n<br>Email: {$user['email']}\n<br>Online? $status\n<br>"; 
     } else { // If user doesn't exists - trigger this event 
      echo " Account Searcher: <br> 
      <form action=\"\" method=\"get\"> 
      Username: <input type=\"text\" name=\"username\" placeholder=\"User not found!\"> 
      <input type=\"submit\" value=\"Search\"> 
      </form><hr> 
      "; 
      echo "<title> User doesn't exists! | Prospekt </title> <p><b>Error:</b> User doesn't exist! Please register first!</p>"; 
     } 
} 

// showing the login & register or logout link 
if (logged_in() == true) { 
    echo '<a href="../logout.php">Log Out</a> | <a href="../home.php"> Go to Home </a>'; 
} else { 
    echo '<a href="../login.php">Login</a> | <a href="register.php">Register</a>'; 
} 
?> 
<hr /> 
</body> 
</html> 
+0

Тег pdo не нужен, поскольку ни один из этих кодов не является pdo. Это все mysqli. Я не вижу, где у вас есть ')'. был ли символ отправлен через текстовое поле? – McStuffins

+0

Извините за это :) Я просто удалил PDO-тег и PDO во вступление – virtualAnon

ответ

0

Вы отправляете значения непосредственно в запрос к базе данных прежде, чем утвердить их, которые могут привести к dangers.To предотвратить SQL инъекции есть встроенные функции php, такие как mysqli_real_escape_string() , будучи тем, что полное лучшим решением с использованием Php подготовленных операторов с PDO ..

В коде: если вы принимаете какие-то данные от пользователя или от получения или почтового переменных делают это

<?php 

$uname=$_GET['username']; 
//now validate 
$username=mysqli_real_escape_string($conn,htmlspecialchars($uname)); 
//Now username is somewhat protected.so now use it for sql queries. 

?> 
+1

[Mysqli также может использовать подготовленные заявления] (http://php.net/manual/en/mysqli.prepare.php) – Terminus

+0

I dint знаю, что спасибо человеку @Terminus – StackB00m

+0

Я пробовал свой код, теперь ошибка Warning: mysqli_real_escape_string() ожидает ровно 2 параметра, 1 задано в ... on line ... – virtualAnon

0

Вашими код уязвим для SQL-инъекций. Лучшая идея - параметризовать запросы с помощью подготовленных операторов или pdo. Также избегайте струн и санируйте их. Подробнее о подготовленных операциях: http://php.net/manual/en/mysqli.quickstart.prepared-statements.php

+0

Я довольно хорошо знал, что эти коды уязвимы для SQL-инъекций, это больше похоже на _training_ для меня, потому что я Мне всего 13 лет и ученикам 2-го курса старших классов :) спасибо за идею tho – virtualAnon

+0

Я тоже начал свой возраст, мы все в процессе обучения. Всегда используйте подготовленные заявления и используйте pdo, если вы считаете, что будете переходить на другие программы баз данных. @virtualAnon –

+0

Я буду использовать PDO, как только я собираюсь «переложить» на другие программы баз данных, я использую MySQLi теперь, потому что у меня есть только MySQL в моей программе хостинга (которая является 000Webhost) [я не знаю, t рекламировать эту услугу хостинга] – virtualAnon

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