Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] CHMOD
Forum PHP.pl > Forum > Przedszkole
moto0095
Witam. Przeszukałem google i nigdzie nie mogę znaleźć czegoś takiego.
A mianowicie mam oto taki kod php:

  1. <?php
  2. if ($handle = opendir('./galeria'))
  3. {
  4. while (($file = readdir($handle))!=false)
  5. {
  6. if ($file != '.' && $file != '..') {
  7. echo '$file<input type=text name=chmod><a href=chmod.php>dalej</a></a>';
  8. }
  9. }
  10. }
  11. closedir($handle);
  12. ?>


Wyświetla on listę plików w katalogu "galeria".
I mam takie pytanie jak zrobić aby w polu <input type=text name=chmod> po wpisaniu np: 0666 plik dostawał takie chmody questionmark.gifquestionmark.gif
Rysh
W czym problem użyć chmod?

moto0095
ja wiem jak użyć chmod() tylko nie wiem jak jakoś to połączyć
mortus
Albo przekazujesz dane za pomocą formularza metodą post, albo za pomocą linka metodą get. Nie możesz mieszać tego i tego, tak jak masz:
  1. echo '$file<input type=text name=chmod><a href=chmod.php>dalej</a>';
Jeżeli chcesz wykorzystać formularz, to będziesz musiał skorzystać z input-a o typie button i możesz jako jego wartość (value) przekazać nazwę pliku, którą masz w zmiennej $file. Później tylko z tablicy $_POST odczytujesz nazwę pliku i prawa, no i używasz funkcji chmod.
Rysh
  1. chmod($_GET['plik'], $_GET['chmod']);
mortus
Cytat(Rysh @ 28.03.2010, 17:43:23 ) *
  1. chmod($_GET['plik'], $_GET['chmod']);
Polecałbym raczej użyć formularza i wysłać dane metodą post. Użycie metody get jest niebezpieczne, bo potencjalny użytkownik mógłby zmienić prawa dostępu do innych plików wykorzystując adres w przeglądarce.
moto0095
Coś mi nie wychodzi. Zrobiłem takie coś ale nic się nie dzieje:
  1. <?php
  2. if ($handle = opendir('./galeria'))
  3. {
  4. while (($file = readdir($handle))!=false)
  5. {
  6. if ($file != '.' && $file != '..') {
  7. echo'<form method="post" action="?zdjecie"><input value="galeria/'.$file.'" name="file">';
  8. echo '<br><input type=text name=chmod><input type="button" value="dalej"></form>';
  9. }
  10. if(id == "zdjecie"){
  11. chmod($_POST['file'], $_POST['chmod']);
  12. }
  13. }
  14. }
  15. closedir($handle);
  16. ?>
Rysh
Cytat(mortus @ 28.03.2010, 17:49:37 ) *
Polecałbym raczej użyć formularza i wysłać dane metodą post. Użycie metody get jest niebezpieczne, bo potencjalny użytkownik mógłby zmienić prawa dostępu do innych plików wykorzystując adres w przeglądarce.

Nie widzę problemu też zmienić prawa dostępu do innych plików przez formularz.
W każdym razie, moto0095 chyba niema zamiaru tego udostępniać dla użytkownika. Więc proste zabezpieczenie powinno załatwić sprawę np:

  1. if ($_SESSION['admin'] && isset($_GET['plik']) && isset($_GET['chmod'])) {
  2. chmod($_GET['plik'], $_GET['chmod']);
  3. }


moto0095 co to jest w 10 linijce?
mortus
Cytat(Rysh @ 28.03.2010, 18:31:23 ) *
Nie widzę problemu też zmienić prawa dostępu do innych plików przez formularz.
Nazwę pliku w formularzu przesyłamy w polu typu hidden i ma ona jedno, określone value. W polu typu text podajemy natomiast prawa, jakie chcemy nadać. Więc w jaki sposób zmienisz prawa dostępu do innego pliku?
Cytat(Rysh @ 28.03.2010, 18:31:23 ) *
W każdym razie, moto0095 niema zamiaru tego udostępniać dla użytkownika. Więc proste zabezpieczenie powinno załatwić sprawę np:
  1. if ($_SESSION['admin'] && isset($_GET['plik']) && isset($_GET['chmod'])) {
  2. chmod($_GET['plik'], $_GET['chmod']);
  3. }
Tylko co będzie, jeśli moto zechce któremuś plikowi nadać uprawnienia inne niż 0666? Ma zrobić tyle odnośników ile uprawnień?
moto0095
Nie mam zamiaru udostępniać tego wszystkim.
Ale nadal mi coś nie działa. sciana.gif

właściwie to chodzi mi właśnie tylko o nadawanie chmod 0666
mortus
No to jeśli chodzi o nadawanie zawsze chmod 0666, to po co je w ogóle przekazywać?
  1. <?php
  2. if($handle = opendir('./galeria')) {
  3. while (($file = readdir($handle)) !== false) {
  4. if ($file != '.' && $file != '..') {
  5. echo '$file : <a href="chmod.php?filename="' . $file . '>Zmień prawa</a><br/>';
  6. }
  7. }
  8. }
  9. closedir($handle);
  10. ?>
I plik chmod.php
  1. if(isset($_GET['filename']) && $_GET['filename'] != '') {
  2. chmod('galeria/' . $_GET['filename'], 0666);
  3. }
Założenie jest takie, że plik chmod.php i katalog galeria są w tym samym katalogu. Jeżeli nie, to trzeba odpowiednią ścieżkę podać.
Oczywiście trzeba jeszcze zabezpieczyć kod w pliku chmod.php, przed nieautoryzowanym wykonaniem (np. przy pomocy tablicy $_SESSION, jak pisał Rysh).
Rysh
Cytat(mortus @ 28.03.2010, 18:42:06 ) *
Nazwę pliku w formularzu przesyłamy w polu typu hidden i ma ona jedno, określone value. W polu typu text podajemy natomiast prawa, jakie chcemy nadać. Więc w jaki sposób zmienisz prawa dostępu do innego pliku?
Tylko co będzie, jeśli moto zechce któremuś plikowi nadać uprawnienia inne niż 0666? Ma zrobić tyle odnośników ile uprawnień?

Mały test, zrób sobie pliczek:
  1. <html>
  2. <head></head>
  3. <body>
  4. <?php
  5. echo "<pre>";
  6. print_r($_POST);
  7. echo "</pre>";
  8. ?>
  9. <form method="POST">
  10. <input type="hidden" name="id" value="trescukryta" />
  11. <input type="text" name="jawne" /><br />
  12. <input type="submit" name="send" value="Wyslij" />
  13. </form>
  14. </body>
  15. </html>

Odpal przeglądarkę i sprawdź co zwraca.

A następnie wykonaj sobie taki trick, jeśli posiadasz Google Chrome wejdź PPM -> Zbadaj zawartość i zmodyfikuj tam kod html, ponownie wprowadź jakieś dane i sprawdź co tym razem zwraca input hidden winksmiley.jpg To, że jest schowany nie znaczy że jest on nie do zmieniania winksmiley.jpg
Jeśli nie posiadasz Google Chrome o to screen: http://wstaw.org/w/2V2/

Nic trudnego prawda? winksmiley.jpg


@moto0095:
  1. <?php
  2. if($handle = opendir('./galeria')) {
  3. while (($file = readdir($handle)) !== false) {
  4. if ($file != '.' && $file != '..') {
  5. echo "<a href=\"chmod.php?plik=". $file ."\">Zmień chmod.</a>";
  6. }
  7. }
  8. }
  9. closedir($handle);
  10. ?>


Plik chmod.php:
  1. <?php
  2. if (isset($_GET['file']) && $_SESSION['admin']) {
  3. if (chmod($_GET['file'], 0666)) {
  4. echo "Zmnieniono CHMOD.";
  5. } else {
  6. echo "Bład.";
  7. }
  8. }
  9.  
  10. ?>
mortus
Cytat(Rysh @ 28.03.2010, 19:28:55 ) *
Mały test, zrób sobie pliczek:
  1. <html>
  2. <head></head>
  3. <body>
  4. <?php
  5. echo "<pre>";
  6. print_r($_POST);
  7. echo "</pre>";
  8. ?>
  9. <form method="POST">
  10. <input type="hidden" name="id" value="trescukryta" />
  11. <input type="text" name="jawne" /><br />
  12. <input type="submit" name="send" value="Wyslij" />
  13. </form>
  14. </body>
  15. </html>

Odpal przeglądarkę i sprawdź co zwraca.

A następnie wykonaj sobie taki trick, jeśli posiadasz Google Chrome wejdź PPM -> Zbadaj zawartość i zmodyfikuj tam kod html, ponownie wprowadź jakieś dane i sprawdź co tym razem zwraca input hidden winksmiley.jpg To, że jest schowany nie znaczy że jest on nie do zmieniania winksmiley.jpg
Jeśli nie posiadasz Google Chrome o to screen: http://wstaw.org/w/2V2/

Nic trudnego prawda? winksmiley.jpg


Wniosek z tego taki, że zawsze trzeba zabezpieczać skrypt przed nieautoryzowanym dostępem.

Cytat(Rysh @ 28.03.2010, 19:28:55 ) *
@moto0095:
  1. <?php
  2. if($handle = opendir('./galeria')) {
  3. while (($file = readdir($handle)) !== false) {
  4. if ($file != '.' && $file != '..') {
  5. echo "<a href=\"chmod.php?plik=". $file ."\">Zmień chmod.</a>";
  6. }
  7. }
  8. }
  9. closedir($handle);
  10. ?>


Plik chmod.php:
  1. <?php
  2. if (isset($_GET['file']) && $_SESSION['admin']) {
  3. if (chmod($_GET['file'], 0666)) {
  4. echo "Zmnieniono CHMOD.";
  5. } else {
  6. echo "Bład.";
  7. }
  8. }
  9.  
  10. ?>

Mój kod z pierwszego listingu wyświetlał nazwę pliku, a obok link dalej, służący do zmiany uprawnień do pliku o tej nazwie. Opcjonalnie zamiast dalej mogłeś wpisać Zmień prawa, ale to mało istotne. Twój plik chmod.php jest zupełnie bez sensu. Dlaczego? Bo przecież w $_SESSION nie musi być indexu 'admin', tylko może być inny. W $_GET przekazujesz tylko nazwę pliku, a plik jest w podkatalogu galeria. Poza tym nazwę pliku przekazujesz w $_GET['plik'], a nie $_GET['file']. Mój warunek z issetem jest mało istotny, natomiast to co Ty napisałeś w ogóle nie zadziała. Przyglądnij się uważnie.
Rysh
To prawda $_GET['plik'] zamist $_GET['file'] - mój błąd.
Kod się oczywiście nie wykona jeśli w $_SESSION['admin'] nie będzie wartości true.
Czyli jeśli nie jesteś adminem - proste.

Co do pierwszej części chciałem Ci udowodnić że tak samo łatwo zmienić $_POST jak i $_GET winksmiley.jpg
moto0095
Wielkie dzięki .
Ale taka mała uwaga w kodzie jaki podał mortus jest taki mały błą
Cytat(mortus @ 28.03.2010, 19:15:57 ) *
No to jeśli chodzi o nadawanie zawsze chmod 0666, to po co je w ogóle przekazywać?
  1. <?php
  2. if($handle = opendir('./galeria')) {
  3. while (($file = readdir($handle)) !== false) {
  4. if ($file != '.' && $file != '..') {
  5. echo '$file : <a href="chmod.php?filename="' . $file . '>Zmień prawa</a><br/>';
  6. }
  7. }
  8. }
  9. closedir($handle);
  10. ?>


W wierszu 5 powinno być
  1. echo ''.$file.' : <a href="chmod.php?filename="' . $file . '>Zmień prawa</a><br/>';
snitch.gif


nie niestety nie działają oba skrypty pokazuje się:
Warning: chmod() [function.chmod]: Operation not permitted in /home/a8963311/public_html/file/chmod.php on line 3
mortus
To może jeszcze raz. Struktura katalogów:
Kod
projekt\
    galeria\
        photo001.jpg
        photo002.jpg
        ...
    index.php
    chmod.php
Niech plik index.php wyświetla listę plików, a obok odnośnik do zmiany praw dostępu. Zatem treść pliku index.php:
  1. <?php
  2. if($handle = opendir('./galeria')) {
  3. while (($file = readdir($handle)) !== false) {
  4. if ($file != '.' && $file != '..') {
  5. echo $file . ' : <a href="chmod.php?filename=' . $file . '">Zmień prawa</a><br/>';
  6. }
  7. }
  8. }
  9. closedir($handle);
  10. ?>
Plik chmod.php natomiast powinien wyglądać tak:
  1. <?php
  2. if(isset($_GET['filename']) && $_GET['filename'] != '') {
  3. if(chmod('galeria/' . $_GET['filename'], 0666)) {
  4. echo 'Prawa do pliku ' . $_GET['filename'] . ' zostały zmienione!<br/>';
  5. } else {
  6. echo 'Prawa do pliku ' . $_GET['filename'] . ' nie zostały zmienione!<br/>';
  7. }
  8. }
  9. ?>
  10. <a href="index.php">Powrót</a>
Przetestowałem i działa.
@moto0095 Ostrzeżenie mówi, że próbowałeś wykonać niedozwoloną operację. Możliwe, że wskazałeś na niewłaściwy plik albo pliku nie ma w tym katalogu.
moto0095
Niestety cały czs to samo sadsmiley02.gif .
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.