Задавайте вопросы, мы ответим
Вы не зашли.
Здраствуйте)Подскажите пожалуйста в чем может быть моя ошибка:мне необходимо изменять данные в БД,но вылезает ошибка.
<form enctype='multipart/form-data' method=post> Исполнитель:<br> <INPUT TYPE=text SIZE=40 NAME=executor_name VALUE=Исполнитель><br> Фотография исполнителя:<br> <input type="file" name="image"><br> <input type=submit value='Загрузить'> </form> <?php $executor_name = $_POST['executor_name']; require_once("config.php"); if($_FILES['image']['tmp_name'] != '') { // Читаем содержимое файла $content = file_get_contents($_FILES['image']['tmp_name']); // Уничтожаем файл во временной директории unlink($_FILES['image']['tmp_name']); // Экранируем спец-символы в бинарном содержимом файла $content = mysql_escape_string($content); // Формируем запрос на добавление файла в таблицу $query = "UPDATE executors SET image_content=$content WHERE executor_name = $executor_name "; if(mysql_query($query)) { echo "Фотография исполнителя успешно загружена в базу данных<br>"; } else exit(mysql_error()); } ?>
Отредактированно Никита (31.01.2008 15:46:18)
Неактивен
какая именно ошибка возникает?
Неактивен
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\0JFIF\0\0\0\0\0\0яю\0;CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality ' at line 1
Неактивен
кавычки не стоят в sql-запросе
SET image_content='$content'
И еще - безопасность Вашего кода нулевая по отношению к инъекциям. $_POST['executor_name'] переменная заданная Вам снаружи - Вы передаете ее в sql-запрос без кавычек и без mysql_escape_string (второе делаете, возможно полагаясь на настройку magic_quotes_gpc).
Неактивен
Да теперь все работает)А в чем может заключаться опасность от инъекций?
Неактивен
У вас запрос UPDATE executors SET image_content=$content WHERE executor_name = $executor_name
Представьте себе, что злонамеренный человек сделал POST, передав executor_name="1 OR 1", тогда запрос у Вас получится
UPDATE executors SET image_content=$content WHERE executor_name = 1 OR 1
Такой запрос (так как 1 - всегда истина) обновить аватар ВСЕМ юзерам.
Есть и другие применения со стороны злоумышленника.
Неактивен
А как этого не допустить?
Неактивен
В начале всех скриптов сделайте include("common.php"); который взять из кода форума punbb и в вольном изложении приведен далее. Он нивелирует действие magic_quotes_gpc.
Далее, все переменные, перед передачей в SQL-запрос, преобразуйте с помощью mysql_escape_string(), а в самом запросе заключайте в одинарные кавычки.
<?php
/* Based on the original function by Rickard Andersson (rickard@punbb.org) */
function unregister_globals()
{
// Prevent script.php?GLOBALS[foo]=bar
if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS']))
exit('I\'ll have a steak sandwich and... a steak sandwich.');
// Variables that shouldn''t be unset
$no_unset = array('GLOBALS', '_GET', '_POST', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES');
// Remove elements in $GLOBALS that are present in any of the superglobals
$input = array_merge($_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES,
isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array());
foreach ($input as $k => $v)
{
if (!in_array($k, $no_unset) && isset($GLOBALS[$k]))
unset($GLOBALS[$k]);
}
}
function stripslashes_array($array) {
return is_array($array) ?
array_map('stripslashes_array', $array) : stripslashes($array);
}
if (get_magic_quotes_gpc())
{
$_GET = stripslashes_array($_GET);
$_POST = stripslashes_array($_POST);
$_COOKIE = stripslashes_array($_COOKIE);
}
set_magic_quotes_runtime(0);
if (ini_get('register_globals'))
unregister_globals();
?>
Неактивен
То есть должно получиться что то подобное:
<form enctype='multipart/form-data' method=post> Исполнитель:<br> <INPUT TYPE=text SIZE=40 NAME=executor_name VALUE=Исполнитель><br> Фотография исполнителя:<br> <input type="file" name="image"><br> <input type=submit value='Загрузить'> </form> <?php $executor_name = $_POST['executor_name']; include("common.php"); require_once("config.php"); if($_FILES['image']['tmp_name'] != '') { // Читаем содержимое файла $content = file_get_contents($_FILES['image']['tmp_name']); // Уничтожаем файл во временной директории unlink($_FILES['image']['tmp_name']); // Экранируем спец-символы в бинарном содержимом файла $content = mysql_escape_string($content); mysql_escape_string($content,$executor_name); // Формируем запрос на добавление файла в таблицу $query = "UPDATE executors SET image_content='$content' WHERE executor_name = '$executor_name' "; if(mysql_query($query)) { echo "Фотография исполнителя успешно загружена в базу данных<br>"; } else exit(mysql_error()); } ?>
Неактивен
Странная строчка: mysql_escape_string($content,$executor_name);
Вы наверное имели в виду: $executor_name = mysql_escape_string($executor_name);
Неактивен
Такое нужно проделать со всеми переменными полученными из формы,а все остальное оставить как есть?
Неактивен
вообще говоря со всеми переменными, про которые не известно заведомо, что они числовые
Неактивен
А с числовыми такое не пройдет?
Неактивен
можно и к числовым применять mysql_escape_string(), это ничего не изменить
Вы должны быть уверены, что в переменной число, это можно сделать например так:
$number = intval($_POST['number']);
много уязвимостей возникает из-за неучета данного факта - хитрые взломщики вместо числа передают строку
Неактивен
Пасиба что подсказали как улучшить защищенность сайта)Все отлично заработало)
Неактивен