konto usunięte

Temat: Uaktualnianie rekordów na podstawie przekazanej zmiennej.

Witam, probuje zrobic formularz do uaktualniania danych. Na razie mam stworzona strone updateWorker.php z dolaczonym do niej recordset. Po jej wywolaniu formularz jest zawze wypelniany danymi z tylkopierwszego rekordu. Chcialbym teraz umożliwić wybór dowolnego rekordu Czyli wpisuje do formularza1 wartosc (np: pracownikID) i chcę zeyb otworzyła mi sie strona updateWorker.php z danymi nalezacymi do danego pracownikID.

Mam jakas prostą forme typu:

<form id="form1" name="form1" method="post" action="updateWorker.php">
<label>
<input type="text" name="pracownikID" id="pracownikID" />
</label>
<label>
<input type="submit" name="submit" id="submit" value="Submit" />
</label>
</form>

i strone docelową (updateWorker.php) w ktorej po prostu dolozylem:[...]
<input name="pracownikID" type="hidden" id="pracownikID" value="<?php echo $_POST['pracownikID']; ?>" />
[...]

Wartosc jest przekazywana i wpisywana, ale oczywiscie nie wplywa to na resztę danych. Co powinieienm zrobic zeby to dzialalo?
Czy SQL powinien zrobic query do bazy danych?Dawid Karel edytował(a) ten post dnia 25.04.08 o godzinie 17:56

Temat: Uaktualnianie rekordów na podstawie przekazanej zmiennej.

$res = mysql_query("SELECT * FROM nazwatabeli WHERE pracownikID = $_POST['pracownikID'] LIMIT 1");

while($row = mysql_fetch_array($res) )
{

?>
<input name="pracownikID" type="hidden" id="pracownikID" value="<?php echo $row['pracownikID']; ?>" />

<input name="pracownikName" type="text" id="pracownikName" value="<?php echo $row['pracownikName']; ?>" />

<input name="pracownikITD" type="text" id="pracownikITD" value="<?php echo $row['pracownikITD']; ?>" />

<?
}
?>Daniel W. edytował(a) ten post dnia 25.04.08 o godzinie 18:09
Jarosław Lisicki

Jarosław Lisicki programista,
Gadu-Gadu

Temat: Uaktualnianie rekordów na podstawie przekazanej zmiennej.

$res = mysql_query("SELECT * FROM nazwatabeli WHERE pracownikID = $_POST['pracownikID'] LIMIT 1");
Proponuje jednak:
$res = mysql_query('SELECT * FROM nazwatabeli WHERE pracownikID = '.(int)@$_POST['pracownikID'].' LIMIT 1');

echo htmlentities($row['pracownikID']);
Paweł Lenk

Paweł Lenk informatyk,
programista,
bezpieczeństwo,PBX
Asterisk

Temat: Uaktualnianie rekordów na podstawie przekazanej zmiennej.

Zapominacie jednak o bezpieczeństwie. mysql_escape_string broni przed wszelkimi niepowołanymi znakami, poza tym nazwy elementów powinny być w `` a wartości w ''.
Wiem czepiam się, ale mnie to osobiście razi jak cholera.
Jeżeli to jest php5 polecam mysqli. Ponoć lepsze. ;)

konto usunięte

Temat: Uaktualnianie rekordów na podstawie przekazanej zmiennej.

Daniel to oczywiście pojechał po całości - ale pewnie po prostu nie wziął bezpieczeństwa w tym przykładzie pod uwagę.

Paweł:
mam złą wiadomość: mysql_escape_string nie jest bez wad.
Przykład: http://securityvulns.com/CVE-2007-1779.html

Jarosław zastosował najbezpieczniejsze filtrowanie: (int), ale oczywiście nie jest to koniec - zawsze można zmienić dane nie-swoje, dlatego pewnie trzeba byłoby dodawać gdzieś po drodze weryfikację, czy aktualny użytkownik ma prawo do zmiany wskazanego rekordu pracownika.

Temat: Uaktualnianie rekordów na podstawie przekazanej zmiennej.

Tak, przedstawiłem tylko ogólny zarys problemu w najprostszy sposób, a resztę zostawiam Dawidowi. Przecież, nic nie pisał, że to jeszcze ma być bezpieczne ;-) Do tego dojdziemy, pewnie w kolejnych postach ;-)

Mogę tutaj zasugerować kilka przydatnych funkcji, choć każdy ma i tak swoje sprawdzone metody:)

function isValidInteger($AInteger)
{
if (is_numeric($AInteger) && ereg("[0-9][0-9]*", $AInteger)) {
return true;
} else {
return false;
}
}

function isValidIntegerFrom($AInteger, $AMin, $AMax)
{
if (is_numeric($AInteger) &&
ereg("[0-9]+", $AInteger) &&
$AInteger >= $AMin &&
$AInteger <= $AMax) {
return true;
} else {
return false;
}
}

function my_mysql_unescape($AStr)
{
$res = str_replace('\r', "\r", $AStr);
$res = str_replace('\n', "\n", $res);
return stripslashes($res);
}Daniel W. edytował(a) ten post dnia 26.04.08 o godzinie 13:42
Paweł Lenk

Paweł Lenk informatyk,
programista,
bezpieczeństwo,PBX
Asterisk

Temat: Uaktualnianie rekordów na podstawie przekazanej zmiennej.

A to przepraszam, nie zrozumiałem założeń. Karę wykonam na sobie o godzinie 14:05 wynosząc śmienie. ;)
Swoją drogą zabezpieczenia nie gwarantują 100% bezpieczeństwa, ale ograniczają liczbę osób które mogą to zrobić. Dlatego jestem zwolennikiem, żeby niektóre rzeczy robić odruchowo, żeby to było nawykiem, potem to będzie z górki.
PS. Ciekawa dziura. Myślałem że to domena MSSQL. ;)

konto usunięte

Temat: Uaktualnianie rekordów na podstawie przekazanej zmiennej.

Dziekuje wszysktim za posty. Wczoraj to juz zrobilem wlasnie po poscie Daniela. Troche musialem sie pomeczyc, bo
$res = mysql_query("SELECT * FROM nazwatabeli WHERE pracownikID = $_POST['pracownikID'] LIMIT 1");
zawieral (przynajmniej tak mi sie wydawalo blad) powinno byc:
$res = mysql_query("SELECT * FROM nazwatabeli WHERE pracownikID = '$_POST[pracownikID]' LIMIT 1");
wtedy dopiero mi poszlo.

Ogolnie chcialem poznac sama zasade wlasnie wyszukiwania, wiec kwestie zabezpieczen to oczywiscie inna sprawa. Int fajnie bedzie dzialalo w takim przypadku, ale chcialbym np miec takze mozliwosc wyszukiawania po np nazwisku, czy dacie.
Zazwyczaj przepuszczam moje wpisy przez funckje tworzoną przez dreamweavra czyli:

if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;

$theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

switch ($theType) {
case "text":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "long":
case "int":
$theValue = ($theValue != "") ? intval($theValue) : "NULL";
break;
case "double":
$theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
break;
case "date":
$theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
break;
case "defined":
$theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
break;
}
return $theValue;
}
}

wydaje mi sie to bezpieczne...(?).

Mam ogolnie jeszcze jedno pytanie chociaz nie wiem czy nie powinienm otworzyc kolejneg posta...
Chodzi o subformy czyli obsluge relacji jeden do wielu.

Nie mam problemu z prowadzeniem do bazy danych z pierwszego poziomu. Ale jak potem zrobic, jezeli jest np:
Tabela1:
PracownikID (AI)
Imie
Nazwisko

Tabela2
DzieckoAuto (AI)
ImieDziecka
Data_Urodzenia
fk_tabela1_pracownikID

I jak utworzyc taki jeden formularz dodajacy pracownika i jego dzieci. Czyli dodajac do bazy moge wpisac imie i nazwisko, następnie dodac tyle dzieci ile pracownik posiada, i na koncu wszystko razem zapisac.

W ogole na razie nie mam pojecia jak to ugryźć.
Pozdrawiam i jeszcze raz dzieki za pomoc.

konto usunięte

Temat: Uaktualnianie rekordów na podstawie przekazanej zmiennej.

Paweł Lenk:
PS. Ciekawa dziura. Myślałem że to domena MSSQL. ;)

Też długo wierzyłem że te wszystkie funkcje _escape_ są najlepszym zabezpieczeniem, ale ktoś tam po drodze mnie wyprowadził z błędu.

Najlepsze są zabezpieczenia domenowe - takie jak tu już wypisane - m.in. w postach Dawida i Daniela. Najmocniejszy filtr to (int) - w przypadku nie-integera po prostu zrobi zero (0). Inne już nie są takie trywialne i mogą nie zawsze działać. Jeśli wartość jest alfanumeryczna (np. nazwa użytkownika lub nazwa szablonu) to polecam najpierw przed użyciem przewalcować ją RegExpem - np:

function filter_regexp_alphanum($value)
{
$res = preg_replace('/[^A-Za-z0-9]+/', '', $value);
return $res;
}

konto usunięte

Temat: Uaktualnianie rekordów na podstawie przekazanej zmiennej.

Dawid, Twój najnowszy problem, jak i większość zagadnień bezpieczeństwa, znajdzie proste rozwiązanie jak przerzucisz się na pisanie w jakimś frameworku w duchu MVC. Jeżeli relacje w bazie danych będziesz miał odzwierciedlone w obiektach danych, to tego typu rzeczy będziesz robił od ręki. Ja polecam RubyOnRails, dla chcących dalej się męczyć w php jest klonik cakePHP

konto usunięte

Temat: Uaktualnianie rekordów na podstawie przekazanej zmiennej.

Piotr, dzieki za sugestie.Mam kumpla ktory zdecydowanie polecal mi CakePHP, nawet wydrukowałem sobie caly manual, ale chyba jeszcze nie ten poziom co dla mnie.. ciezko mi sie to rozgryza. Do Ruby tez sobie jakis tam manual sciagnalem ale to powyzsze to wlasnie kawalek mojej pracy inzynierskiej, wiec musze to jakos dociagnac do konca a potem bede probowal kilka innych rzecyz przy okazji. Suma sumarum musze to juz zlozyc w normalnym php... tylko jak...
Jarosław Lisicki

Jarosław Lisicki programista,
Gadu-Gadu

Temat: Uaktualnianie rekordów na podstawie przekazanej zmiennej.

zawieral (przynajmniej tak mi sie wydawalo blad) powinno byc:
$res = mysql_query("SELECT * FROM nazwatabeli WHERE pracownikID = '$_POST[pracownikID]' LIMIT 1");
wtedy dopiero mi poszlo.

takie zapytanie moze i dziala ale po pierwsze $_POST[pracownikID] nie jest poprawnym zapisem powinno byc $_POST['pracownikID'], po drugie takie zapytanie bedzie obciazac bardzo baze bo pracownikID ktory jest jak sie domyslam typu int musi zostac przekonwertowany do postaci string i dopiero wtedy porownany z '$_POST[pracownikID]'

Jezeli pominiemy bezpieczenstwo to
$res = mysql_query("SELECT * FROM nazwatabeli WHERE pracownikID = {$_POST['pracownikID']} LIMIT 1");
takie cos powinno zadzialac ale mimo wszystko naklaniam do dobrych praktyk i proponuje zastosowac to rozwiazanie ktore podalem wyzej:)Jarosław Lisicki edytował(a) ten post dnia 26.04.08 o godzinie 16:08

Następna dyskusja:

Generowanie schematu bazy n...




Wyślij zaproszenie do