Статьи

Найдите дыру в безопасности

Если вы пришли на эту страницу из бюллетеня Tech Times , мы приносим свои извинения. Несколько наших ссылок пошли не так. Вы, вероятно, после одного из следующих действий:

Теперь вернемся к нашей обычной программе …

Вот скрипт PHP:


<?php
# Common include file for MySQL
require("auth_conn_inc_reg.php");

$valid = false;

if (isset($_SERVER['PHP_AUTH_USER']) &&
	isset($_SERVER['PHP_AUTH_PW']) ) {
	
	$sql = "SELECT * FROM users WHERE
		logins='{$_SERVER['PHP_AUTH_USER']}' AND
		password='{$_SERVER['PHP_AUTH_PW']}'";
		
	$mysql_result = mysql_query($sql,$connection);
		
	$num_rows = @mysql_num_rows($mysql_result);
		
	if ( $num_rows != 0 ) {
		$valid = true;
	}
}

if ( !$valid ) {
	header ("WWW-Authenticate: Basic realm="Restricted"");
	header ("HTTP/1.0 401 Unauthorized");
	echo "Authorization required";
	exit();
	
} else {
	
	# Valid user - do stuff here
	
}
?>

Найдите проблему?

Что меня огорчает, когда я это читаю, так это то, что это часть статьи в британском журнале Linux в этом месяце (я опущу название; иначе это хороший журнал). Конечно, все делают ошибки, я сам больше, чем несколько, но этот конкретный пример является классическим и частично объясняет, почему PHP нарушает безопасность.

Что нужно предпринять, чтобы остановить это снова и снова в будущем? Возможно, на http://www.php.net/mysql_query необходимо большое сообщение типа «Прежде чем использовать эту функцию, обязательно прочитайте о mysql_escape_string () . И, возможно, страница mysql_escape_string () могла бы сделать больше, чтобы объяснить, почему это важно?