Въпроси за сигурността:примери, начини на защита

Може ли да се вкара SQL инжекция през този код
Използвам PDO
PHP:
<?php
$hostname = 'localhost';
$username = 'root';
$password = 'pass';
$database = 'base';
    $dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
    echo 'Connected to database<br />';

    $count = $dbh->prepare("INSERT INTO pdo(username, password) VALUES (?, ?)");
    $count->execute(array('ime', 'parola'));
    $dbh = null;
?>
 
t0shk0 каза:
Може ли да се вкара SQL инжекция през този код
Използвам PDO
PHP:
<?php
$hostname = 'localhost';
$username = 'root';
$password = 'pass';
$database = 'base';
    $dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
    echo 'Connected to database<br />';

    $count = $dbh->prepare("INSERT INTO pdo(username, password) VALUES (?, ?)");
    $count->execute(array('ime', 'parola'));
    $dbh = null;
?>

Щом използваш prepare значи не.
 
Сори за глупавия въпрос. А ако ползвам query или exec ще може ли.
Аз съм направил една книга за гости с BD. За да предотвратя XSS атаки да сложа ли addslashes и htmlspecialchars преди въвеждането на данните в BD или само при тяхното извеждане
 
t0shk0 каза:
Сори за глупавия въпрос. А ако ползвам query или exec ще може ли.
Аз съм направил една книга за гости с BD. За да предотвратя XSS атаки да сложа ли addslashes и htmlspecialchars преди въвеждането на данните в BD или само при тяхното извеждане
Да, това ще те защити. :)
 
Здравейте,направих си следната функция:

PHP:
function protect($var){
        if (is_numeric($var)){
            return $var;
        }
        else {
            return htmlspecialchars(addslashes($var));
        }
    }
С нея ще филтрирам всичи входни данни в базата данни.Въпросът ми е: ще могат ли да ми правят XSS или Mysql Injection?
Благодаря предварително!
 
Проверявай get_magic_quotes_gpc() и ако е включена, слагай stripslashes();

Код:
if(get_magic_quotes_gpc())
    {
        $var = stripslashes($var);
    }

Сложи и trim на резултата.
 
Nazi_93 каза:
Здравейте,направих си следната функция:

PHP:
function protect($var){
        if (is_numeric($var)){
            return $var;
        }
        else {
            return htmlspecialchars(addslashes($var));
        }
    }
С нея ще филтрирам всичи входни данни в базата данни.Въпросът ми е: ще могат ли да ми правят XSS или Mysql Injection?
Благодаря предварително!

Функцията htmlspecialchars() филтрира не повече от половината XSS атаките, а и тук играят роля различията между това как браузърите рендерират html... Addslashes също, хората са измислили PDO.
 
Аз пък за всеки случай на всяка една входна променлива си слагам htmlspecialchars и addslashes, а пък при изход от базата им слагам stripslashes.
 
StormBreaker каза:
@bancov96 За кои XSS дето не филтрира htmspecialchars говориш?

Примерите са много, ето един нагледно: http://www.youtube.com/watch?v=EjiCSWKlsWI

Или пък ползвай някакъв стандартен bb code и пробвай да влезеш през любимия ни браузър, завършващ на 6.0...

javascript:alert(1)

Htmlspecialchars() не предотвратява и половината XSS атаки. :D
 
Здравейте, минавам си всичките входни данни през следната функция:
PHP:
// Функция за филтриране на данните
    function protect($var){
        if (is_numeric($var)){
            return $var;
             }
            else {
                $for_replace = array('"',"'",';',"<",">","/");
                $replaced_with = array('','','','','','');
                $var = str_replace($for_replace, $replaced_with, $var);
                return htmlspecialchars(addslashes($var));
                }
    }
Има ли шанс за каквато и да е атака?
 
Nazi_93 каза:
Здравейте, минавам си всичките входни данни през следната функция:
PHP:
// Функция за филтриране на данните
    function protect($var){
        if (is_numeric($var)){
            return $var;
             }
            else {
                $for_replace = array('"',"'",';',"<",">","/");
                $replaced_with = array('','','','','','');
                $var = str_replace($for_replace, $replaced_with, $var);
                return htmlspecialchars(addslashes($var));
                }
    }
Има ли шанс за каквато и да е атака?

Код:
function protect($var) {
    if (is_numeric($var)) {
        return $var;
    }

    $var = preg_replace('/[^\w\s]+/', '', $var);
    return htmlspecialchars(addslashes($var));
}

ще маха всичко освен azAZ09_ и празно место \n.
 
Ето едно решение против XSS. Понеже htmlspecialchars не ме удовлетворява:

PHP:
function strip_html($value)
{
        if(preg_match("@(\<(/?[^\>]+)\>)@i", $value)){
                $value = NULL;
        }

        return $value;
}

$_GET = array_map("strip_html", $_GET);
$_POST = array_map("strip_html", $_POST);

Понеже мен не ме удовлетворяваше при опит за XSS да ми излизат HTML таговете, просто реших, че трябва напълно да изчезнат, затова и подавам на $value, NULL стойност, когато бъдат срещнати такива.
 
Прочетох по-голяма час от тази тема, но не успях да намеря отговор на моя въпрос , който е:

една година хоствах ъеб сайт в който всички входни данни бяха филтрирани по следния начин:

$var=htmlspecialchars(mysql_real_escape_string($var));

Нямал съм проблеми ,но и е нямало реална заплаха от хакери.

Достатъчна ли е тази защита, при подаване на заявки в MySQL или има някакви пропуски. Ако има, реални примери ще бъдат оценени.

Благодаря!
 
cechBG каза:
$var=htmlspecialchars(mysql_real_escape_string($var));

Да, едната долна черта е хлабава и може да падне, за това я закрепи с нещо.

В много теми вече съм писал, че трябва да знаете къде си подавате данните, какви данни се подават предимно и т.н.
Като тази $var ще влиза единствено в базата данни защо ти е htmlspecialchars? Копирате от където ви падне кодове, а не мислите. То поне прочетете какво правят функциите и помислете дали са ви нужни въобще.
 
PHP:
function filter($string) {
	return preg_replace('/[^a-zA-Z0-9\s\.]/', '', $string);
}

$_GET     = array_map("filter", $_GET);
$_POST    = array_map("filter", $_POST);
$_REQUEST = array_map("filter", $_REQUEST);

И въобще не се занимавам..
 
addslashes() VS mysql_real_escape_string() при входящи данни в MySQL?

При изход се справям с защитаването от XSS, но ми е любопитно, кой според вас е най-сполучливия начин за предотвратяване на SQLi?

Общо взето използвам

Код:
function db_query($File, $Line, $Query, $Param = array(), $Fetch = false, $cache = false)
{
	global $config, $context;
	
	$Query = preg_replace('/\[([\w\d\-\_]+)\]/ie', '(isset($config["$1"])) ? $config["$1"] : mysql_real_escape_string(trim(urldecode($Param["$1"])))', $Query);
$Exec = mysql_query($Query) or die (mysql_error());

Примерна заявка:

Код:
$Results = db_query(__FILE__, __LINE__, 'SELECT `u`.* FROM `[sql_database]`.`[sql_prefix]sessions` AS `s` LEFT JOIN `[sql_database]`.`[sql_prefix]users` AS `u` ON `s`.`u_id` = `u`.`u_id` WHERE `s`.`s_id` = "[s_id]" LIMIT 1', array('s_id' => $data['s_id']), 'FETCH_ASSOC');

Стойността на $data['s_id'] примерно се извлича директно от $_GET. Дали мога да си докарам беля на главата, ако бисквитката бъде манипулирана, или предпазните мерки в db_query() функцията са достатъчни? Принципно всички данни към SQL, без значение дали са от $_POST, $_GET, $_COOKIE или $_SESSION не ги филтрирам по друг начин. Нужно ли е според вас да затягам мерките за сигурност? :)
 

Back
Горе