![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Здраствуйте)Подскажите пожалуйста в чем может быть моя ошибка:мне необходимо изменять данные в БД,но вылезает ошибка.
<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']);
много уязвимостей возникает из-за неучета данного факта - хитрые взломщики вместо числа передают строку
Неактивен
Пасиба что подсказали как улучшить защищенность сайта)Все отлично заработало)
Неактивен