onlyX
13.05.2004, 18:49:13
Sworzyłem taki skromny kod dodający dane do tabeli w bazie danych.
I prosiłbym ludzi lepiej znających php ode mnie o wytknięcie mi błędów, ew. wniesienie poprawek.
[php:1:bb63b676fa]
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=iso-8859-2">
<LINK REL=stylesheet HREF="style.css" TYPE="text/css">
</HEAD>
<BODY>
<?php
$autor_id = $_POST['autor_id'];
$tytul = $_POST['tytul'];
$f_akapit = $_POST['f_akapit'];
$tresc = $_POST['tresc'];
$arrLocale = array( "pl_PL", "polish_pol" );
setlocale( LC_ALL, $arrLocale );
$data = strftime("%A, %d %B %Y");
$sql = mysql_connect ("mojserwer.pl", "login", "hasło");
mysql_select_db("viking");
$zapytanie = mysql_query('SELECT `username` FROM `phpbb_users` WHERE `user_id` = '.$autor_id);
$row = mysql_fetch_array($zapytanie);
$autor = $row['username'];
$zapytanie = "INSERT INTO `w_arts` ( `id` , `data` , `autor_id` , `autor` , `tytul` , `f_akapit` , `tresc` ) VALUES ( '', '$data', '$autor_id', '$autor', '$tytul', '$f_akapit', '$tresc' )";
$wykonaj=mysql_query($zapytanie);
?>
<?php
$sql = mysql_connect ("mojserwer.pl", "login", "hasło");
mysql_select_db("viking");
$query = 'SHOW TABLE STATUS LIKE "w_arts"';
$result = @mysql_query($query);
$row2 = @mysql_fetch_array($result, MYSQL_ASSOC);
$row2['Auto_increment'];
$num_id = ($row2['Auto_increment'] -1);
$zapytanie = mysql_query("SELECT * FROM `w_arts` WHERE id=$num_id");
$row = mysql_fetch_array($zapytanie);
echo ('<CENTER><TABLE WIDTH="700" CELLSPACING="0" CELLPADDING="0" BORDER="0" STYLE="background:url(../gfx/bg_tab.gif)">
<TR><TD><P class="nag_right"> » Data i autor</P></TD>
<TD>'.$row['data'].' || <A HREF="http://www.user.mtnet.com.pl/viking/forum/profile.php?mode=viewprofile&u='.$row['autor_id'].'">'.$row['autor'].'</A> || id='.$row['autor_id'].'</TD></TR>
<TR><TD><P class="nag_right"> » Tytuł artykułu</P></TD>
<TD>'.$row['tytul'].'</TD></TR><TR><TD WIDTH="200"><SPAN class="nag_right"> » Pierwszy akapit</SPAN><BR><SPAN class="des_just">Akapit ten jest wstępem do tekstu, powinien po krótce przedstawiać tematykę artykułu (max. 3-4 zdania).</SPAN></TD>
<TD>'.$row['f_akapit'].'</TD></TR><TR><TD><P class="nag_right"> » Treść artykułu</P></TD>
<TD>'.$row['tresc'].'</TD></TR><TR><TD> </TD><TD> « <A HREF="dadaj_art.html">Wstecz</A></TD></TR></TABLE></CENTER>');
?>
</BODY>
</HTML>
[/php:1:bb63b676fa]
invx
13.05.2004, 18:54:58
ale dziala Ci

, skoro tak to jest poprawny. A to jak sie rozwiaze dany problem to zalezy od osoby ktura go rozwiazuje.
P.S.
sa wyjatki
e4you
13.05.2004, 19:03:00
zmienna $sql moze byc 1 raz a Ty ja masz uzytą pare razy.
zmienna $zapytanie tez jest 2 razy uzyta
onlyX
13.05.2004, 19:05:00
Cytat
A to jak sie rozwiaze dany problem to zalezy od osoby ktura go rozwiazuje.
A jeśli osoba, która rozwiązuje ten problem (w tym wypadku ja) nie jest do końca zadowolona z tego co stworzyła? Chce uczynić ten kod bardziej przejrzystym i funkcjonalnym.
Może jednak znajdzie się ktoś kto da wskazówki.
shima
13.05.2004, 19:15:13
Cytat
zmienna $sql moze byc 1 raz a Ty ja masz uzytą pare razy.
zmienna $zapytanie tez jest 2 razy uzyta
Dlaczego? Może użyć wiele razy, inna sprawa: po co? Wystarczy raz utworzyć połączenie z bazą. A zapytania mogą się zmieniać.
e4you
13.05.2004, 19:28:07
to mialem na mysli
onlyX
13.05.2004, 20:34:34
A może dałoby się poprawić przejżystość tego skryptu?
hwao
13.05.2004, 20:36:41
php pocz -> Skrypty php
cboot
14.05.2004, 03:41:19
[php:1:fbbc76639d]<?php
// zmienne liczbowe z zewnątrz - zapobiegamy sql injection
$autor_id = (int) $_POST['autor_id'];
// zmienne tekstowe z zewnątrz - zapobiegamy umieszczaniu javascript i tym podobnych
$tytul = strip_tags($_POST['tytul']);
$f_akapit = strip_tags($_POST['f_akapit']);
$tresc = strip_tags($_POST['tresc']);
?>[/php:1:fbbc76639d]
Warto byłoby też pamiętać o łataniu wszelkich luk umożliwiających SQL injection. Stąd conajmniej ta konwersja $autor_id z POST (luka ta umożliwiała drobną penetrację tabeli phpbb_users). Na wszelki wypadek (jeśli skrypt byłby np. rozbudowywany w przyszłości) można łatać tak wszystkie zmienne liczbowe otrzymywane z zewnątrz (post, get, cookies). Zmienne tekstowe są w tym wypadku nieszkodliwe, jeśli mamy ustawione na serwerze magic_quotes_gpc. Wszelkie inne zmienne, które są wstawiane do zapytań bez apostrofów czy cudzysłowów, to potencjalne SQL injection.
Po co zabezpieczać się przed javascript, który później mógłby być wyświetlony na stronie, to chyba nie muszę tłumaczyć.
onlyX
14.05.2004, 10:37:45
Dzieki. O tego typu wskazówki mi chodziło.
Niestety nie moge skorzystać z funkcji strip_tags() ponieważ usuwa ona równierz znaczniki html, których potrzebuje do formatowania tekstu. Ten skrypt bedzie używany tylko przez osoby upoważnione, więc takie zabezpieczenia nie będą potrzebne.
cboot
14.05.2004, 11:41:03
Możesz też w strip_tags podać tagi, których nie chcesz usuwać: [manual:7de6564bc6]strip_tags[/manual:7de6564bc6]. I wymienić jako drugi parametr tej funkcji te bezpieczne tagi, które służa jedynie do formatowania tekstu.
onlyX
14.05.2004, 12:16:50
Jeszcze raz dzięki. Problem rozwiązałem w ten sposób.
[php:1:776231c8bb]<?php
$znaczniki = "<P>, <SPAN>, <B>, <I>, <BR>";
$tytul = strip_tags($_POST['tytul']);
$f_akapit = strip_tags($_POST['f_akapit'], $znaczniki);
$tresc = strip_tags($_POST['tresc'], $znaczniki);
?>[/php:1:776231c8bb]
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.