Има две много важни неща, които трябва да направите, за да избегнете сериозни проблеми със сигурността.
-
Трябва да избегнете въвеждането на потребителя, преди да го поставите във вашата SQL заявка. Екраниране означава екраниране на всички специални знаци като
'
; за щастие има функция, която вече го прави автоматично:mysql_real_escape_string .Ако не избягате от въвеждането на потребителя, могат да се случат неприятни неща. Представете си, че вашата заявка е
INSERT INTO userdata VALUES ('$user_data')
. Сега си представете, че потребителят е написал'; DROP DATABASE userdata;
.Ако не го избегнете, вашата заявка ще бъде:
INSERT INTO userdata VALUES (''; DROP DATABASE userdata;')
. Както можете да си представите, това не е добре:ако имате активирани няколко изявления, можете да се сбогувате с вашата база данни. Това се нарича SQL инжекция атака. -
Когато извеждате вашата променлива на потребителя, вие също трябва правилно да замените HTML специалните знаци с HTML обекти. За щастие има функция, която да направи и това:htmlspecialchars() . Той ще трансформира специалните HTML знаци като
<
до<
.Това изглежда е проблем, който често се подценява, но в действителност е много сериозен. Представете си, ако
$user_data
съдържа<script>SomeNastyScript()</script>
. Той може да използва съществуващите уязвимости в браузъра на вашите потребители или може да изпрати бисквитка, която не е HTTPOnly (която може да съдържа запазени пароли) на нападателя, или може да подмами потребителя да напише паролата си във формуляр, генериран чрез манипулиране на DOM (възможно в javascript) или много други лоши неща.Това се нарича XSS (Скриптове между сайтове).
Кратка версия
-
Обадете се на
mysql_real_escape_string
на низа, преди да го вмъкнете във вашата SQL заявка (но не и когатоecho
то). -
Обадете се на
htmlspecialchars
върху низа, преди да го покаже на потребителя (но не и когато го поставите в базата данни).