2016-10-19 2 views
0

iam, используя этот код ниже, но символ «&» не будет вставлен в db, также когда я копирую/вставляю какой-либо текст с других страниц и помещаю его в db текст заканчивается, например, в середине текста, не знаю, почему, я попробовал также addslashes() и htmlspecialchars() или htmlentities().Запись данных в mysql с помощью mysqli_real_escape_string(), но без &

i read mysqli_real_escape_string() - это снова атаки SQL-инъекций и htmlspecialchars() против прикреплений XSS, должен ли я также их комбинировать?

$beschreibung = mysqli_real_escape_string($db, $_POST['beschreibung']); 
+0

"не вставлено" КАК? вы получаете сообщение об ошибке, если оно присутствует? это станет другим символом? и нет, escape_string недостаточно для предотвращения всех форм sql-инъекции, а htmlspecialchars абсолютно НИЧЕГО не относится к sql –

+0

, вы не хотите, чтобы «&» хранилось в db, или вы хотите знать, как защитить свой скрипт от SQL-инъекции или xss – mohade

+0

@MarcB Я предполагаю, что строка запроса прекращается до ожидаемого. Тем не менее, когда появляется символ '&', он не обрабатывается как строка, а команда для 'и ' –

ответ

0

SQL Injection - это просто некорректно отформатированные запросы. То, что вы делаете, недостаточно, остановитесь сейчас. Приступить к практике использования подготовленных заявлений.

$Connection = new mysqli("server","user","password","db"); 
$Query = $Connection->prepare("SELECT Email FROM test_tbl WHERE username=?"); 
$Query->bind_param('s',$_POST['ObjectContainingUsernameFromPost']); 
$Query->execute(); 
$Query->bind_result($Email); 
$Query->fetch(); 
$Query->close(); 

Выше приведен пример использования подготовленных операторов. Он быстро и легко отформатирует ваш запрос.

Моя догадка, что происходит, я предполагаю, что вы используете только стандарт:

$Query = mysqli_query("SELECT * FROM test_tbl WHERE Username=".$_POST['User']); 

Поскольку этот запрос не отформатирован, вы можете иметь котировки в вашем куске текста, который близко строка запроса. Затем PHP интерпретирует все как команду для отправки на SQL-сервер.

0

Если вы знаете, что делаете, вы можете самостоятельно вывести индау и добавить в запрос экранированные данные до тех пор, пока вы окружаете данные одинарными кавычками в sql. Пример:

$db = mysqli_connect("localhost","my_user","my_password","my_db"); 
$beschreibung = mysqli_real_escape_string($db, $_POST['beschreibung']); 
$results = mysqli_query(
    $db, 
    sprintf("INSERT INTO foo (beschreibung) VALUES ('%s')", $beschreibung) 
); 

Чтобы получить предсказуемые результаты, я советую вам использовать то же кодировку, E, G, UTF-8, последовательно через приложение.