у меня проблема с моей базой данных и проверкой ошибок.
Если хакер решит изменить имя моей базы данных или любой из таблиц, он уничтожит мою страницу.
Я обнаружил это после того, как попробовал свою веб-страницу на другом компьютере, где у меня была папка избранного с именем избранное.
Я перепробовал все: от обработки ошибок try catch до проверки счетчика и последующего перехода на страницу с ошибкой, если возвращается 0 count. Ив пробовал всякое, но безрезультатно.
обычно я отправляю своего пользователя на страницу с ошибкой. Но я не могу перенаправить с указанием местоположения заголовка, потому что проверка находится в середине PDO и цикла while
Я покажу вам код.
Как я могу избежать этой проблемы
Если имя базы данных избранного изменено на любое другое, кроме избранного. он убивает страницу... Но отображается половина страницы. Но я не могу перенаправить с указанием местоположения заголовка, если попытаюсь поймать ошибку.. Которая даже не регистрируется как ошибка..
if ($_SESSION['loggedin']==='001'){
if ($db = new PDO("mysql:host=localhost;dbname=favourrites", '????', '')){
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//add ;pagination order by limit
$query11 = "SELECT * FROM `$useremail` WHERE `faveID` = '$listID' ";
$stat11=$db->prepare($query11);
$stat11->execute();
while($row = $stat11->fetch()){
$faveID=$row['faveID'];
}
if (!isset($faveID)) {$faveID = "000";}
else
if (empty($faveID)) {$faveID = "000";}
else
if (!$faveID) {$faveID = "000";}
if ($faveID===$listID){
echo"
<img id='favicon[$fid]' data-variable-uid='{$UID}' data-variable-
listid='{$listID}' data-variable-accountname='{$accountname}'
src='../images/mainpage/fave1.png' title='Allready Added To
Favorites' class='iconlarge' style='opacity:0.9'
onclick='favecheck($fid);'></img>";
}
else
{
echo"
<img id='favicon[$fid]' data-variable-uid='{$UID}' data-variable-
listid='{$listID}' data-variable-accountname='{$accountname}'
src='../images/mainpage/fave2.png' title='Add To Your Favorites
List' class='iconlarge' style='opacity:1'
onclick='favecheck($fid);'></img>";
}
}else{
error_reporting(E_ALL);
ini_set("display_errors", 1);
header("Location: ../imageupload/error");
die();
echo '<script type = "text/javascript">';
echo 'window.location.href = "../imageupload/error.php";';
echo '</script>';
echo '<noscript>';
echo '<meta http-equiv = "refresh" content = "0;url='.$url.'" />';
echo '</noscript>';
exit();
}
}
В приведенном выше коде добавлены попытки перенаправления, но пока ни одна из них не сработала, включая многие другие.
например, проверка результата подсчета и т. д...
Как перенаправить на мою страницу с ошибкой.
Я попробовал вызов функции, но я не знаком с функциями PHP, и я попытался вызвать его как функцию jscript.
Любая помощь очень нужна.
Спасибо.
Нет оператора MySQL для переименования базы данных. Вы можете переименовать таблицы, чтобы переместить их каждую в другую базу данных, но вы не можете просто переименовать базу данных как одно изменение.
Извините, имена таблиц... если я сам изменю избранное на что-то другое, это приведет к сбою страницы, но проблема в том, что я не могу перенаправить, если есть ошибка такого рода, поэтому хакер может сломать мою страницу из-за этого.
Это не то, как вы используете подготовленные операторы. Ваш код по-прежнему уязвим для SQL-инъекций.
где стоит $useremail, выглядит необычно.






если хакер имеет доступ к изменению имени базы данных, все кончено.
но ты можешь сделать это
try {
$db = $db = new PDO("mysql:host=localhost;dbname=favourrites", '????', '')
} catch (PDOException $e) {
//echo 'Connection failed: ' . $e->getMessage(); // i suggest you do something with the error
header("Location: ../imageupload/error");
die();
}
в улове сделать перенаправление. Но опять же, вы действительно должны быть в положении, когда это может когда-либо произойти.
я попробовал этот улов, но он не выдает ошибки, и моя страница все еще зависает на полпути, но спасибо. Там, вероятно, сумма причин, почему /
ну, в комментариях вы теперь говорите свою таблицу, а не имя базы данных, поэтому мой ответ к этому не относится, вместо этого вы можете попробовать поймать запрос. @MelissaHicking
Имейте 2 пользователей базы данных, 1 из которых является «суперпользователем», который используется вами при прямом доступе к базе данных.
Второй пользователь - это «пользователь приложений», которого ваше приложение/страница использует для доступа к своей собственной базе данных, этот пользователь «заблокирован», поэтому у него есть только разрешение делать то, что ему нужно, со своими собственными таблицами. Все, что он не должен делать, он настроен так, что у него нет разрешения на выполнение этого действия/доступа к таблице.
Вы должны ВСЕГДА использовать подготовленные операторы для запросов ВСЕ, чтобы вы случайно не открыли какие-либо дыры в безопасности (атаки SQL Injection), если вы измените источник любых данных на предоставленный пользователем. (НИКОГДА доверяет любым данным, предоставленным любым пользователем, независимо от того, насколько хорошо вы их знаете.
Если база данных недоступна по какой-либо причине, в зависимости от вашего приложения, вы можете рассмотреть возможность выхода из скрипта, выводя пользователю удобное для пользователя сообщение об ошибке (но не сообщая никаких технических подробностей, записывайте подробности ошибки в свои журналы ошибок). )
Меня больше всего беспокоит, почему страница не будет перенаправляться, когда запрос или соединение с БД не удается. Я знаю, что я не должен ничего отображать перед перенаправлением. т. д., но должен быть способ перенаправления.
Если вы используете инструменты разработчика Chrome для просмотра заголовков, какие заголовки отображаются?
эй, поскольку вы используете объектно-ориентированный подход к вашему соединению, это вызовет исключение, которое вам придется поймать, если нет, вы можете перейти к процедурному стилю и использовать его возвращаемое значение в качестве указания, следует ли вводить оператор if.