2015-07-09 2 views
-1

Я не использую подготовленные заявления и я не хочу, чтобы использовать его, если не необходимый- защита

Пример:

$sqlServ = new mysqli(SQL_HOST, SQL_USER, SQL_PASS); 
$char = isset($_GET['char']) ? sanitize($_GET['char']) : null; 
$check = $sqlServ->query("SELECT name FROM player.player WHERE name LIKE '{$char}'"); 

function sanitize($var) 
{ 
    $var = htmlentities($var, ENT_QUOTES); 
    $var = htmlspecialchars($var, ENT_QUOTES, 'UTF-8'); 
    if (get_magic_quotes_gpc()) { 
     $var = stripslashes($var); 
    } 
    return $var; 
} 

достаточно ли для защиты SQL инъекций? Спасибо за ответ.

+7

*** НЕТ! *** единственный надежный способ защитить ваш код от SQL-инъекции - использовать *** параметризованные запросы ***, а не объединять ваши SQL-предложения! Прекратите тратить время на попытку «фильтровать» или «дезинфицировать» ваш SQL - просто ** используйте параметры ** и сделайте с ним! –

+1

Не ленитесь, послушайте советы marc_s, маркеры параметров - это путь. – jarlh

+0

Хорошее объяснение здесь: http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php – patricmj

ответ

1
$var = htmlentities($var, ENT_QUOTES); 

Плохая идея. HTML-кодирование для выходного каскада, где вы используете <?php echo htmlspecialchars($var); ?> переменных в HTML-шаблоне. Если вы попытаетесь справиться с этой проблемой на выходе во время ввода, вы получите ввод, который не обязательно кодируется в базе данных, не позволяя вам правильно сопоставлять, нарезать и сортировать его. И если вы затем выведете содержимое из базы данных без экранирования, у вас все еще есть ошибки XSS для любого контента, который приходит через средства, отличные от ввода формы.

HTML-кодирование при создании HTML и ни в какое другое время.

$var = htmlspecialchars($var, ENT_QUOTES, 'UTF-8'); 

Да? Это уже закодировано HTML, зачем его дважды закодировать? Гарантируется, что они будут искажать символы, такие как & и <, а также (из-за предыдущих htmlentities) всех символов, отличных от ASCII.

Достаточно ли для защиты от инъекций sql?

Не совсем. В основном: здесь нет кода защиты SQL-инъекций.

Существует HTML-экранирование, но обратные слэши являются специальными символами в строковых литералах MySQL, а обратные косые черты не затрагиваются с помощью HTML-экранирования. Поэтому входные строки с завершающим обратным слэшем разбивают конец ' в запросе, делая запрос недействительным.

Так получилось, что после этого нет никаких других символов или инъекций ' в строке, нет способа использовать этот конкретный запрос; вы можете заставить его сломаться. Но как только запрос изменится, это уже не так.

Чтобы выполнить SQL-инъекцию «защита», вы должны вызвать $sqlServ->real_escape_string() по значению непосредственно перед тем, как поместить его в строковый литерал в запросе. Но это действительно легко забыть или ошибиться. Использование параметризованных запросов последовательно является более надежным подходом и не сложнее.