2015-07-24 2 views
0

Я работаю над веб-сайтом, и я использую mysqli для подключения к базе данных. Но я не знаю, что использовать, чтобы избежать ввода html для пользователя в форме. Я слышал strip_tags, htmlspecialchars и многие другие. Что я должен использовать? Я хочу защитить мою базу данных от peekers, но я также хочу защитить данные пользователей. У меня есть md5ed пароль.Защита ввода пользователя

+0

https://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php – Anonymous

+0

md5 относительно бессмысленна. Это устаревший метод, который можно взломать в считанные секунды. Лучшей практикой (насколько мне известно) является шифрование паролей таким образом, что каждый пользователь имеет уникальную соль. – skrilled

+0

Лучшее, что вы можете сделать, это использовать подготовленные операторы и параметризованные запросы при разговоре с базой данных. Кроме того, соль ваши пароли – Jaime

ответ

0

Чтобы избежать инъекций SQL и упростить ввод данных, используйте prepared statements.

Работа с вводом HTML зависит от того, что разрешено, и хотите ли вы, чтобы определенные входы принимали HTML или нет.

Если вы не хотите, чтобы HTML для ввода, вы можете дополнительно использовать strip_tags, чтобы полностью удалить HTML из ввода и затем проверить его далее.

Если вы хотите, чтобы отобразить значение из базы данных, которые пришли из пользовательского ввода, используйте htmlspecialchars или htmlentities так, чтобы любые HTML-теги будут преобразованы из < в &lt; поэтому выходе не разобранный, как поэтому HTML позволяет людям ставить вредоносных ссылок или тегов скриптов на ваших страницах.

0

Я не уверен, что у вас есть только форма входа в систему или у вас есть форма регистрации. Если у вас есть регистрационная форма, которая отправляет данные в базу данных, попробуйте прочитать о sanitizing. Эта практика уже поможет вам в XSS-инъекции в вашей базе данных. Одно замечание: не прилагайте особых усилий для дезинфекции пароля, так как вы не хотите испортить пароль пользователя.

Как уже было сказано, MD5 и SHA1 теперь бессмысленны, они являются дырами в безопасности. Если вы используете Php 5.5, вам следует использовать методы @Mark Baker, написанные в его комментарии: password_hash()/password_verify().

Я бы порекомендовал использовать что-то вроде blowfish, если честно, это здорово.

Вот небольшой фрагмент кода для вас, если вы хотите создать соль:

public static function createSalt($aLength = 16, $aCost = 10){ 
    $salt = strtr(base64_encode(mcrypt_create_iv($aLength)), '+', '.'); 
    $salt = sprintf("$2y$%02d$", $aCost) . $salt; 
    return $salt; 
} 

И как создать пароль

public static function createPassword($aPassword, $aSalt) { 
    return crypt($aPassword, $aSalt); 
} 

Тогда вы могли бы создать пароль базы на пользовательский ввод + соль.

P.S Всегда полезно избегать значений, которые вы вставляете в базу данных.

1

При получении данных от пользователя вы всегда должны использовать filter extension. Он имеет множество фильтров санитарии и валидации, которые вы можете использовать.

Например, если вы регулируете форму с полями name, age, email и pass, то вы можете фильтровать их с помощью фильтров, которые имеют смысл:

// This filter strips tags from the input 
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING); 

// This filter strips anything that is not a numeral (a whole number) 
$age = filter_input(INPUT_POST, 'age', FILTER_SANITIZE_NUMBER_INT); 

// This filter strips characters that are illegal in email addresses 
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL); 

// This filter does not do anything to the input 
$pass = filter_input(INPUT_POST, 'pass', FILTER_UNSAFE_RAW); 

Использование встроенного password hashing API хэш пароля :

$password = filter_input(INPUT_POST, 'password', FILTER_UNSAFE_RAW); 
$hashed = password_hash($password, PASSWORD_BCRYPT); 

...и для проверки паролей:

$password = filter_input(INPUT_POST, 'password', FILTER_UNSAFE_RAW); 
$hashed = '[HASHED PASSWORD FROM DATABASE]'; 

if (password_verify($password, $hash)) { 
    echo 'Valid password!'; 
} else { 
    echo 'Invalid password!'; 
} 

Если у вас установлена ​​более старая версия PHP, этот API может быть недоступен для вас. В этом случае вам стоит рассмотреть возможность обновления PHP до новейшей стабильной версии. Более новые версии PHP более безопасны, чем более старые версии, поэтому ... обновление! Всегда обновляйте, когда сможете.

Если обновление невозможно, вы можете использовать this compatibility library.

Что касается базы данных с помощью MySQLi API, в частности, его prepared statements:

$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING); 
$password = filter_input(INPUT_POST, 'password', FILTER_UNSAFE_RAW); 
$hashed = password_hash($password, PASSWORD_BCRYPT); 

// Create a database connection 
$db = new MySQLi('localhost', 'username', 'password', 'database'); 

// Prepare an SQL query with placeholders 
$stmt = $db->prepare('INSERT INTO `users` (`name`, `hash`) VALUES (?, ?)'); 

// Always expect errors and do something about them! 
if ($stmt === false) { 
    die('Prepare error: ' . $db->error); 
} 
// Bind the username and password to the prepared statement 
$stmt->bind_param('ss', $username, $hashed); 

// Execute and do something... 
if ($stmt->execute()) { 
    echo 'Saved successfully!'; 
} else { 
    echo 'Error: ', $stmt->error; 
}