Избягване на грешки и инжекции от кавички в PHP и MySQL
Автор: jooorooo
Така, започваме един малък, но полезен урок за кавичките в php.
Ще започнем с кавичките използвани при визуализиране на заявка.
Например имаме следния код:
<?php
$link = "http://web-tourist";
echo "<a id="test" href="$link">Web-tourist</a>";
?>Тук ще ви даде грешка на ред
echo "<a id=test href="$link">Web-tourist</a>";Защо става така?
Така е защото възприема тези кавички като затваряши и показва съобщение за неочакван край.
Как да се предпазим от такъв вид грешки?
Отговора е лесен, има няколко варянта за избегване на грешки, ето ги и тях:
Комбинираме еденична и двоина къвичка:
<?php
$link = "http://web-tourist";
echo '<a id="test" href="$link">Web-tourist</a>';
?>или
<?php
$link = "http://web-tourist";
echo "<a id='test' href='$link'>Web-tourist</a>";
?>Следваш варянт е избягване на кавички при задаване на линка, но той не е много подходящ метод, поради често неизпълнение на променливите:
<?php
$link = "http://web-tourist";
echo "<a id=test href=$link>Web-tourist</a>";
?>Следващ начин е които в момента е най-разпространен и може би най-подходящ е да се използват само
двойни кавички и наклонена черта \ (задължително тази).
Пример:
<?php
$link = "http://web-tourist";
echo "<a id=\"test\" href=\"$link\">Web-tourist</a>";
?>Сега ще минем към кавичките и SQL инжектирането.
Значи за инжектиране на SQL с еползва наклонена черта \ и кавички. Ето ви един пример.
Да речем че имаме форма за вход, но нямаме каквато и да е филтация на символи.
SELECT * FROM user WHERE username='$username' AND password='$password'До тук всичко е нормално, но не е така. Достатъчно е да знае този който иска да хакне името
на някой потребител, а както се досещате това лесно се намира. Та така да продължиме.
Хакера (ако мога така да се израза) пише в полето името на потребителя,
а в полето за парола въвежда:
'or 1=/*Да предположим, че ползва име joro. Тогава заявката към SQL ще има следния вид:
SELECT * FROM user WHERE username='joro' AND password='or 1=1/*'и така с помощта на кавичката
'инжектирахме в заявката
or 1=1от което заявката ни се тълкува така:
ИЗБИРАМЕ всичко ОТ user КЪДЕТО потребител=’joro’ И парола=’ИЛИ 1=1/*’
Което винаги връща истина и така ще имаме достъп до страницата на joro.
Друг пример е ако ползвате метода гет, тои може да напише спокойно следния линк:
http://site.com/login.php?ime=joro&pass='or 1=/*Получава се същото действие. Как да се предпазим?
Най-разпространен и често използван метод е с addslashes(). Тази функция има за цел,
да замества точно кавичките и наклонената черта (). Ето ви един пример за функцията:
<?php
$str = "Is your name O'reilly?";
$echo = addslashes($str);
echo $echo;
?>Както забелязвате сме написали „Is your name O’reilly?“, а ще се визуализира по следния начин:
„Is your name O\’reilly?“. Забелецете как добавя наклонена черта преди кавичката, а ако добавиме
и една наклонена черта към текста „Is your name O’reilly? \ „, изходния резултат ще е следния:
„Is your name O\’reilly? \ „
Тази функция е предимно за места с въвеждане на текст с методите GET, POST и COOKIE.


