Проблем с Mysql заявка.

farzy

Registered
Здравейте хора, направих си SMS реклама скрипт, но като тествам системата, забелязах бъг.
Ето SQL:

PHP:
-- --------------------------------------------------------

--
-- Структура на таблица `horizontal`
--

CREATE TABLE IF NOT EXISTS `horizontal` (
  `id` int(12) NOT NULL auto_increment,
  `banner` text NOT NULL,
  `link` text NOT NULL,
  `data` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

Ето така изкарвам записите от базата данни:



PHP:
$date = time();
$rand = mysql_query("SELECT * FROM `horizontal` WHERE data+$expire>$date ORDER BY RAND() LIMIT 0,1") or die(mysql_error());
if(mysql_num_rows($rand) == 0)
{
    echo "$zero";
}
else
{
    while($row = mysql_fetch_assoc($rand))
    {
        echo "<a href='$row[link]'><img src='$row[banner]' width='$bannerwidth' height='$bannerheight' style='border: 0px' /></a>";
    }
}


А ето и заявката:

PHP:
<form action="" method="post">
Линк към банера: <input type="text" size="20" name="banner"/><br/>
Линк към сайта: <input type="text" size="20" name="link"/><br/>
SMS код: <input type="text" size="20" name="sms"/><br/>
<input type="submit" name="code" value="Жега!"/>
</form>
<?php
$ip=$_SERVER["REMOTE_ADDR"];
$prefix = "payfun";
if (isset($_POST['code'])) {
if (trim($_POST['code']) != NULL) {
$code = $_POST["sms"];
$tmp = file_get_contents('http://wisdom.bg/smscheckcode.php?prefix='.$prefix.'&code='.$code.'&user_ip='.$_SERVER['REMOTE_ADDR']);
$tmp = unserialize($tmp);
if (preg_match('/^Invalid prefix/i', $tmp['error'])) {
echo "Невалиден код!";
}
if ($tmp['result'] == TRUE) {
$time = time();
        $query = mysql_query("INSERT INTO `horizontal` (banner, link, data) VALUES('$banner', '$link', '$time')") or die(mysql_error());
?>
<p class="msg-success">
<strong>Поздравления:</strong> Успешно пуснахте реклама при нас.</p>
<?php
file_get_contents('http://wisdom.bg/smscheckcode.php?prefix='.$prefix.'&code='.$code.'&mark_as_used=1&user_ip='.$_SERVER['REMOTE_ADDR']);
}
}
}
?>

А линка всъщност се записва така в базата данни:

Код:
???? ?? ????: <b><a href="http://****.info/vote.php?id=1">http://****.info/vote.php?id=1</a></b>

Странно, защото правя една заявка, а ми извършва съвсем друга. :(
 
От кода, който си дал, не става много ясно дали ползваш глобални променливи или не. Винаги е добра идея да използваш $_POST['link'] вместо $link, още повече, че register_globals би трябвало да е изключено по подразбиране в РНР 5+.

След като записа съдържа HTML код, това означава, че ти дори не филтрираш информацията, която потребителя ти подава, което би довело до проблеми със сигурността. Никога нямай вяра на потребителите и филтрирай информацията, която ти изпращат, независимо дали метода е GET или POST.

Също така избягвай подобни имена на променливи като link, data и т.н. И в РНР и в MySQL има дълъг списък със запазени думи, които, ако не ги ползваш по правилния начин, може да ти докарат странни проблеми. Ограждай имената на колоните и таблиците с обратен апостроф ` за да ги избегнеш, ако държиш да ползваш точно тези запазени думи.
 
РНР - групирани са в три отделни списъка:
http://php.net/manual/en/reserved.php


MySQL
http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html
 
В insert заявката имаш $link, означава ли това, че са ти включени register_globals? Каква е вероятността променливата $link всъщност да се използва някъде на съвсем друго място, в някакъв include файл и така да ти омазва заявката?

В полето link, аз ще очаквам потребителя да напише някакъв URL (дори и с параметри). При submit на формуляра, ще използвам strip_tags и trim за да разкарам всичко, което не трябва да е там.

След това трябва да се уверя, че този текст е реален URL. На първо време бих проверил (със или без регулярни изрази), дали започва с http. За по-сигурно, с нещо като cURL, бих пробвал дали получавам HTTP код 200, и едва тогава ще го записвам.
 

Back
Горе