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

fcvc_gaming каза:
А ако ползвам Preprare statements на MySQLi класа дали ще е добре
Това е най-добрия вариант, защото с него е почти невъзможно да те инжектират.
 
HerpaMoTeH каза:
fcvc_gaming каза:
А ако ползвам Preprare statements на MySQLi класа дали ще е добре
Това е най-добрия вариант, защото с него е почти невъзможно да те инжектират.

О може, повярвай ми. :)
 
Има възможност за вмъкване на SQL Injection в SELECT заяви при WHERE и ORDER BY. Това, че използваш prepared statements не означава, че не трябва да филтрираш входящата информация.
 
bancov96 каза:
Има възможност за вмъкване на SQL Injection в SELECT заяви при WHERE и ORDER BY. Това, че използваш prepared statements не означава, че не трябва да филтрираш входящата информация.

Как ще вмъкнеш инжекция при положение, че тези неща не се пращат в заявката
 
StormBreaker каза:
bancov96 каза:
Има възможност за вмъкване на SQL Injection в SELECT заяви при WHERE и ORDER BY. Това, че използваш prepared statements не означава, че не трябва да филтрираш входящата информация.

Как ще вмъкнеш инжекция при положение, че тези неща не се пращат в заявката

И на мен ми е интересно. Някой може ли да обясни?
 
Използвам тази защита за защита от XSS атаки:
<?php
function clean($var) {return addslashes(htmlspecialchars($var));}
?>

Можете ли да ми разясните какво по-точно прави тя? Също така можете ли да ми предложите защити срещу други видове атаки и ако има по добра за защита от XSS? Прочетох за защита от SQLi, но не можах да разбера как по-точно работи можете ли да ми разяснтие(кое как работи и как трябва да го променя за моя сайт) тази защита:

PHP:
	$dsn = 'mysql:dbname=testdb;host=localhost';
$user = 'dbuser';
$password = 'dbpass';

try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
    exit();
}

$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
 
radibg2

Разгледай какво правят двете функции htmlspecialchars и addslashes, чети в php.net, тествай ги.

Винаги когато правиш дадена валидация на информация, която очакваш от потребителя да е въведе, е валидирай така както очакваш да е информацията.

Тоест, примерно ако очакваш да е потребителско име, най - вероятно не очакваш потребителското име да съдържа тези символи: "< ' ' " > !@#$%^&*) " и др които би било странно да ги има. Просто ги премахвай или си прави регулярен израз със допустимите символи: [a-zA-Z0-9_], примерно.

Ако очакваш дадено нещо да е число каствай го със (int) или проверявай със is_numeric();, ако ще искаш да връщаш грешка.

Като за начало сядаш и учиш какво прави htmlspecialchars, addslashes, htmlentities, какво е регулярен израз, след това: preg_match / preg_match_all, preg_replace - те работят със регулярните изрази и какво е кастване.

След всичко това, вече може да обърнем внимание на PDO.
ПДО е вид обръщение към базата данни.
Самото MYSQL (ако ползваш него), не се вълнува дали ползваш PDO, mysqli, или стандартното mysql, за връзка.

С кода който си дал искам да обърна внимание на prepare и bindparam.

prepare - Както се досещаш от името: Подготвя заявката, която ще се изпраща към базата данни, подготвя е във чист вид (тоест не вкарва никаква информация дадена от потребителя).

bindparam - Е сетването на информацията от потребителя във чист вид и пращането и към заявката. 3 ти параметър от bindparam указва какъв е типа на информацията, за да знае как да процедира със нея.

Разучи какво е PDO има много уроци за него, така ще ти стане много по - ясно.
 
Ако във файл index.php инклудвам други файлове, които не искам да се виждат (да се виждат само от index-a), то това добра защита ли е:

index.php - този файл се вижда
PHP:
<?php
$abcd = "àd215fd4ef6ge45egw842vd1svfóv45we4r rv werg4";//тук си измислям някакъв ред от букви и символи(като парола)

include "file.php";

?>

filе.php - това трябва да се вижда само ако е инклуднато в index.php

PHP:
<?php
if( empty($abcd) || $abcd != "àd215fd4ef6ge45egw842vd1svfóv45we4r rv werg4"){
   echo "Страницата не съществува";
   exit;
}
//тук е основното съдържание на файла
?>

На мен ми изглежда добре, ама все пак да питам.
 
http://php.net/manual/en/function.define.php
index.php
PHP:
<?php 

define(RUN_ME, "RUN);

include_once 'bootstrap.php';


?>
bootstrap.php и всички други файлове
PHP:
<?php
if(!defined(RUN_ME)) die(" STOP HERE") ;
..................................................
 
Е че има ли значение дали е променлива или константа? Освен че с константа става малко по-кратко, има ли друга разлика, става ли по-сигурна защитата?
 
anonimen каза:
Е че има ли значение дали е променлива или константа? Освен че с константа става малко по-кратко, има ли друга разлика, става ли по-сигурна защитата?
Главно не .
 

Back
Горе