Autor Wątek: Czy dodawanie komentarzy w systemie newsów phpns jest bezpieczne?  (Przeczytany 1270 razy)

Offline Jerzykk

  • Użytkownik

# Październik 28, 2015, 11:36:24
Korzystam na stronie z systemu newsów phpns (który niestety nie jest już chyba rozwijany):
http://sourceforge.net/projects/phpns/

Do samych newsów system spisuje się dobrze, ale chciałbym włączyć komentarze pod newsami i nie jestem pewny co do bezpieczeństwa. Phpns nie wykorzystuje bowiem PDO tylko zwykły MySQL do operacji na bazach danych. Ma co prawda jakieś zabezpieczenia:

$new_res = general_query('INSERT INTO '.$databaseinfo['prefix'].'articles
                    (article_title,
                    article_subtitle,
                    article_author,
                    article_cat,
                    article_text,
                    article_exptext,
                    article_imgid,
                    allow_comments,
                    start_date,
                    end_date,
                    active,
                    approved,
                    timestamp,
                    ip)
              VALUES ("'.$data['article_title'].'",
                      "'.$data['article_subtitle'].'",
                      "'.$author.'",
                      "'.$data['article_cat'].'",
                      "'.$data['article_text'].'",
                      "'.$data['article_exptext'].'",
                      "http://'.$globalvars['path_to_uri'].'/'.$data['image'].'",
                      "'.$data['acchecked'].'",
                      "'.$unixtime['start']['unix'].'",
                      "'.$unixtime['end']['unix'].'",
                      "'.$data['achecked'].'",
                      "'.$data['approved'].'",
                      "'.$globalvars['time'].'",
                      "'.$news_ip.'");');
                     
Następnie w funkcji general_query() wywoływana jest funkcja clean_data(), która jak sądzę (może błędnie?) jest jakimś zabezpieczeniem:

function general_query($query,$array=FALSE) { //for simple/misc queries

if ($clean == TRUE) {
$query = clean_data($query); //clean
}

$res = mysql_query($query) or die('<p><textarea style="width: 50%; height: 200px;">FAILED QUERY: '.$query.'

'.mysql_error().'</textarea></p>');
//return value or not?
if ($array == TRUE) { //if we want a value
$value = mysql_fetch_array($res);
return $value;
} else {
return $res;
}
}
      
Funkcja clean_data() ma taką definicję:

function clean_data($data) {
if (is_array($data)) {
foreach ($data as $key => $value) {
if(ini_get('magic_quotes_gpc')) { $data[$key] = stripslashes($value); }
$data[$key] = htmlspecialchars($value, ENT_QUOTES);
}
} else {
if(ini_get('magic_quotes_gpc')) { $data = stripslashes($data); }
$data = htmlspecialchars($data, ENT_QUOTES);
}

return $data;
}
   
Czy Waszym zdaniem takie zabezpieczenia starczą, żeby np. ktoś nie skasował mi całej bazy danych? A może jedynym wyjściem będzie przejście np. na Wordpress (który pewnie korzysta z PDO)?
« Ostatnia zmiana: Październik 28, 2015, 11:41:20 wysłana przez Jerzykk »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Karol

  • Użytkownik

  • +2
# Październik 28, 2015, 22:11:52
Ja bym na wszelki wypadek tego nawet tyczką nie ruszał ;)

Może gdyby zamiast htmlspecialchars użyto mysql_real_escape_string, ale też nie :U. Plucie błędami SQL na produkcję bezczelnie jest nie profesjonalne.
« Ostatnia zmiana: Październik 28, 2015, 22:14:22 wysłana przez Karol »

Offline Jerzykk

  • Użytkownik

# Październik 29, 2015, 10:00:06
Ja bym na wszelki wypadek tego nawet tyczką nie ruszał ;)

Tak też zrobię, bo używanie tego systemu newsów, to proszę nie się o problemy.

Plucie błędami SQL na produkcję bezczelnie jest nie profesjonalne.


Co rozumiesz poprzez "Plucie błędami SQL na produkcję "? :)

Offline aphity

  • Użytkownik

  • +2
# Październik 29, 2015, 13:05:56
Co rozumiesz poprzez "Plucie błędami SQL na produkcję "? :)
Pewnie to ma na myśli:
(...) die('<p><textarea style="width: 50%; height: 200px;">FAILED QUERY: '.$query.'
                       
                        '.mysql_error().'</textarea></p>');
w przypadku błędu każdy użytkownik będzie mógł sobie poczytać jak wyglądało zapytanie.