2015-02-03 2 views
-1

Я думал, что мой код предотвращает инъекции SQL, но, глядя в Интернет, я понял, что ошибаюсь. Я хватал удостоверение личности с помощью:Предотвращение SQL-инъекций и захватов ID

$id = mysqli_real_escape_string($_GET['id']); 

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

expects exactly 2 parameters, 1 given - Line: 4 

Я не знаю, почему я был в состоянии использовать его в среде тестирования (WAMP), но не здесь , Мне было интересно, каков правильный способ захвата идентификаторов и предотвращения SQL-инъекций?

+0

любезно относятся: http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php –

ответ

0

Правильный способ заключается в использовании prepared statements. Что касается вашего кода, вы используете mysqli_real_escape_string неправильным способом. Вам также необходимо включить соединение с mysqli.

$id = mysqli_real_escape_string($mysqli, $_GET['id']); 

При использовании подготовленных заявлений в этом нет необходимости.

+0

Спасибо. Однако после того, как я прочитал этот http://www.wenda.io/questions/2406383/how-do-i-use-getid-securely-with-pdo-query.html, я узнал, что MySQLi не предотвращает инъекцию sql, Это правда? – Achilles

+0

Ни один из API не предотвратит SQL-инъекцию самостоятельно, вы должны использовать их правильно. Вот почему я рекомендовал подготовленные операторы, потому что вход экранирован, а запрос «предопределен» до того, как запрос действительно запущен (если вы правильно выполняете запрос). Очень важно прочитать официальную документацию, чтобы вы поняли, вместо того, чтобы читать какое-то мнение в Интернете. – EternalHour

0

Я бы просто использовал подготовленный оператор и привязал значение. Как этот пример.

$stmt = $mysqli->prepare("DELETE FROM tbl_users WHERE name = ?"); 
$stmt->bind_param("s", $name); 
$stmt->execute(); 
$stmt->close(); 
Смежные вопросы