2016-07-12 2 views
0

Мой сайт был недавно получен Взломанный/скомпрометированный. Через google я узнал, что это жертва инъекций сайта. Я считаю, что убрал и, надеюсь, защитил свой сайт, но я ищу способы предотвратить его повторение. Я натолкнулся на код (см. Ниже) и хотел бы знать, будет ли онПредотвращение URL-инъекций

1) работать, чтобы предотвратить такие атаки в будущем? и

2) где я должен добавить этот код, поскольку мой сайт построен в WordPress.

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

Код:

<?php 
if(isset($_REQUEST["id"])){ 

if(!is_int($_REQUEST["id"])){ 

//redirect this person back to homepage 

} else { 

$id_raw = trim(htmlentities($_REQUEST["id"])); 
$id_secure = mysql_real_escape_string($id_raw); 
$sql = "SELECT * FROM databasetable WHERE id='".$id_secure."'"; 

} 
} 
?> 
+0

Вы должны использовать подготовленные заявления: http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers – awl19

+0

Это SQL Injection, и да, это плохо. Как упоминалось в @ awl19, используйте подготовленные инструкции или используйте библиотеку, такую ​​как MeekroDB (http://meekro.com/), чтобы запускать ваши запросы (это также облегчило бы работу с базой данных). – mwieczorek

ответ

1

Вы должны понимать это:

  1. Ничто не 100% безопасен.
  2. Все, что вы можете сделать, это повысить уровень безопасности, используя , применяя различные меры безопасности, такие как фильтрация пользовательского ввода перед запросом баз данных с использованием подготовленных операторов.
  3. Использование безопасного соединения для взаимодействия с сервером путем шифрования данных с использованием SHA или MD5 или другого солевого шифрования.
  4. Использование captcha в ваших формах для фильтрации ботов.

Насколько ваш код выше обеспокоен:

  1. это просто проверка запроса идентификатор, является ли целое число или нет.
  2. Он отфильтровывает специальные символы, а затем запускает запрос .

Я хотел бы предложить вам проверить ссылку ниже:

https://www.owasp.org/index.php/PHP_Top_5

Это даст вам представление о том, как реализовать безопасность в приложении.

+0

Любой вид инъекционной атаки (SQL, HTML, XSS) * * Решена проблема и * может * быть сделана на 100% безопасной. Вы просто должны быть усердными. - Другие аспекты «безопасности» действительно могут усложняться и усложняться, особенно когда вы попадаете в социальную инженерию и т. Д., По которой у вас мало технического влияния. – deceze

3

PDO является аббревиатурой PHP Data Objects. PDO - это надежный, последовательный способ доступа к базам данных. Это означает, что разработчики могут писать переносной код намного проще. PDO не является абстракционным слоем, как PearDB. PDO больше похож на уровень доступа к данным, который использует унифицированный API (Application Programming Interface). Вы в основном есть два варианта для достижения этой цели:

Пример:

$qry = $con->prepare('SELECT * FROM student WHERE name = :name'); 

$qry->execute(array('name' => $name)); 

foreach ($qry as $get) { 

// do something with $get 

} 

Настройка базы данных с использованием PDO

$servername = "localhost"; 
$username = "username"; 
$password = "password"; 
$dbname = "myDBPDO"; 

источника данных является в основном строка опций, которые говорят PDO, какой драйвер использовать , и подробности соединения ... Вы можете найти все варианты здесь PDO MYSQL DSN.

$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username,$password); 

Примечание: Если вы получаете ошибку о наборах символов, убедитесь, что вы добавляете параметр кодировки в DSN. Добавление кодировки к DSN очень важно по соображениям безопасности, большинство примеров, которые вы увидите, оставьте это. УБЕДИТЕСЬ, ЧТОБЫ ВКЛЮЧАТЬ ШАРС!

Вы можете также установить некоторые атрибуты после PDO строительства с методом SetAttribute:

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$stmt = $conn->prepare("SELECT id, firstname, lastname FROM MyGuests"); 
$stmt->execute(); 

// set the resulting array to associative 
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC); 
foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) { 
    echo $v; 
} 

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

2

SQL Injection - это тип уязвимости в приложениях, использующих базу данных SQL. Уязвимость возникает, когда пользовательский ввод используется в SQL-заявлении.

$n = $_GET['user']; 
$sql = "SELECT password FROM tbl_login WHERE name = '$n' "; 

Как вы можете видеть значение, которое пользователь вводит URL в пользовательской переменной будет получить, присвоенного переменной $ п, а затем помещается непосредственно в инструкцию SQL. Это означает, что пользователь может редактировать инструкцию SQL.

$name = "admin' OR 1=1 -- "; 
$query = "SELECT password FROM tbl_login WHERE name = '$n' "; 

базы данных SQL будет получить заявление SQL, как:

SELECT password FROM tbl_login WHERE name = 'admin' OR 1=1 -- ' 

Чтобы предотвратить инъекции SQL, мы должны будем использовать то, что называется подготовленные заявления, которая использует связанные параметры. Подготовленные утверждения не объединяют переменные со строками SQL, поэтому злоумышленник не может изменять инструкцию SQL. Подготовленные утверждения объединяют переменную с компилируемым оператором SQL, это означает, что SQL и переменные отправляются отдельно, а переменные просто интерпретируются как строки, а не часть оператора SQL.

Подготовленные заявления с mySQLi.

Используя методы, описанные ниже, вам не нужно использовать какие-либо другие методы фильтрации SQL-инъекций, такие как mysql_real_escape_string(). Это связано с тем, что с помощью подготовленных операторов невозможно выполнить обычную SQL-инъекцию.

mySQLi SELECT Запрос.

$n = $_GET['user']; 


// Prepare the statement 
if ($sql = $mysqli->prepare("SELECT password FROM tbl_login WHERE name=?")) { 


// Bind a variable to the parameter as a string. 
$sql->bind_param("s", $n); 

// Execute the statement. 
$sql->execute(); 

// Get the variables from the query. 
$sql->bind_result($pass); 

// Fetch the data. 
$sql->fetch(); 


// Close the prepared statement. 
$sql->close(); 
} 
+0

Спасибо за отзыв, где именно я бы добавил или разместил ваш код? Я новичок в программировании и php - так простите мое невежество! Добавить это в файл wp-login.php? укажите, где. – yaw

+0

Вам необходимо опубликовать свой код. Как я могу узнать, что содержится в wp-login. Однако вы можете изменить свой sql-скрипт php. – Lucky

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