2016-08-27 3 views
-2

Я новичок в Mysqli и PHP и хочу научиться использовать объектно-ориентированный код вместо процедурного. Однако я пытаюсь преобразовать mysqli_real_escape_string объектно-ориентированным способом. В приведенном ниже коде я использовал процедурный код, потому что я не знаю, как использовать объектно-ориентированный способ, и поиски Google не предоставляют ответы, которые я ищу.mysqli объект ориентированный реальный escape строка

$sql = "SELECT email FROM `users` WHERE email = '".mysqli_real_escape_string($link, $_POST['email'])."'LIMIT 1"; 

     $result = $link->query($sql); 

    if($result->num_rows > 0) { 

     echo "The email " .$_POST['email']. " is already taken"; 

    } else { 

     echo $_POST['email']; 
    } 


} 

В реальном мире я бы иметь какое-то проверку на полях ввода, но и для обучения цели для себя, у меня нет проверки. При этом, если кто-то должен был перейти на страницу регистрации, они могли бы использовать SQL-инъекцию. Я пытаюсь предотвратить это в коде, который проверяет, существует ли адрес электронной почты. Из того, что я прочитал, mysqli_real_escape_string используется для предотвращения внедрения SQL и использования чего-то типа htmlspecialchars для предотвращения XSS. Я пытаюсь предотвратить SQL-инъекцию в этом конкретном примере.

+0

'string mysqli :: escape_string (string $ escapestr)' http://php.net/manual/en/mysqli.real-escape-string.php 'string mysqli :: real_escape_string (строка $ escapestr)'^RTM. –

+0

Вы также должны указать это значение '$ _POST ['email']).« LIMIT », который будет читать как« [email protected] 1 », в свою очередь, вызывая синтаксическую ошибку. Итак,' $ _POST [ 'email']). "LIMIT 1' –

+0

Лучшим способом было бы использовать подготовленные заявления – tkausl

ответ

0

В случае OO вы используете $link->real_escape_string($_POST['email']). В вашем примере вы используете процедурный способ mysqli_reql_escape_string.

Я вижу:

<script>alert("Here is an alert");</script>

вместо все водослива & альта вещи, которые я должен видеть, если бы я сделал это правильно.

Для второй части, я думаю вы Ошибочноreal_escape_string и html_special_chars.
mysqli_real_escape_stringне конвертирует объекты, oposite html_special_chars.

SQL не требует специальных символов, преобразованных в объекты с тех пор. Вы не можете ожидатьmysqli_real_escape_string, чтобы вернуть вас закодированные объекты.

Вкратце, вы не нужны объекты, закодированные для запроса mysql. Только специальные символы mysql, которые могут «навредить» запросу

+0

Итак, вы говорите, потому что я фактически не вставляю данные, мне не нужно использовать real_escape_string, а скорее htmlspecialchars? – Jonathan

+0

Надеюсь, что это не то, что он говорит. Я честно не знаю, почему люди публикуют ответы о html_special_chars и htmlentities. @Jonathan Вы отправили этот комментарий * «Я просто пытаюсь проверить, соответствует ли адрес электронной почты, который вводит пользователь, что-либо в базе данных» * под другим ответом. Если вы пытаетесь это сделать, тогда ваш вопрос пока неясно, и вы даже не ответили на комментарий, который я оставил вас там. Так снова; если вы хотите решить этот вопрос; маякни мне. У вас есть синтаксическая ошибка в вашем коде, и я рассказал, что это такое, это должен быть ваш настоящий код. –

+0

Это не то, что я говорю. Я говорю, что вы хотите сделать это OO. Первая часть вопроса. Вторая часть вопроса предполагает, что вы ожидаете, что real_escape_string вернет &alt; (объекты). Я говорю, что real_escape_string этого не делает. Mysql не нуждается в этом. – Grzegorz

0

mysqli_real_escape_string просто предназначен для безопасного использования строки из пространства пользователя в запросе базы данных (известной как атаки SQL-инъекций). В вашем случае электронная почта (код js) правильно вставлена ​​в БД. Вы можете даже использовать «вместо» теперь, не получив ошибку Mysql.

Но вы хотите отображать данные из пользовательского пространства на веб-сайте HTML, для чего требуется другая модификация для предотвращения межсайтового скриптинга: https://secure.php.net/manual/de/function.htmlentities.php

ТЛ; др:

mysqli_real_escape_string (или его эквивалент ООП) сбегает символы, которые вызывают проблемы в запросе к базе данных, как ' становится \'

htmlentities изменяет символы на соответствующий html-объект, т.е. < преобразуется в &lt;

+0

Я просто пытаюсь проверить, соответствует ли адрес электронной почты, который вводит пользователь, в базе данных – Jonathan

+0

, но у вас действительно есть запись в вашей базе данных с сообщением «email = ', и вы всегда должны использовать real_escape_string, когда используете переменную из пользовательского пространства в ЛЮБОМ запросе. –

+0

Нет, я просто притворяюсь хакером, который может перейти на мою страницу регистрации пользователя и ввести какой-то злой javascript, чтобы сделать что-то неприятное. Поэтому я просто пытаюсь это предотвратить. Это предупреждение javascript не существует в моей базе данных. – Jonathan

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