thesnarkie Posted November 26, 2009 Report Share Posted November 26, 2009 (edited) if($_GET['action'] == "comment") { $sid = $_SESSION['star']; $news_id = mysql_real_escape_string($_POST['news_id']); $comment_val = htmlspecialchars($_POST['comment'], ENT_NOQUOTES); $comment = mysql_real_escape_string($comment_val); list($get_account_id) = mysql_fetch_row(mysql_query("SELECT `id` FROM `account` WHERE `sid`='$sid'", $db)); list($get_post_time) = mysql_fetch_row(mysql_query("SELECT `datetime` FROM `comments` WHERE `account_id`='$get_account_id' ORDER BY `id` DESC LIMIT 0,1", $db)); $sql_3 = mysql_query("SELECT count(*) as counter FROM `comments` WHERE `account_id`='$get_account_id'", $db); $row = mysql_fetch_assoc($sql_3); $reserved_time = $get_post_time + 30; $time_posted = time(); if($comment != "" || $news_id != "") { if($row['counter'] != 0) { //pārbauda vai šis lietotājs jau iepriekš komentējis. if(time() > $reserved_time) { //ja jā, tad pārbauda vai ir pagājušas 30 sekundes pēc pēdējā posta. $sql_insert_1 = mysql_query("INSERT INTO `comments` (news_id, account_id, datetime, comment) VALUES ('$news_id', '$get_account_id', '$time_posted', '$comment')", $db); echo "OK"; exit(); } else { echo "You can't post comments so often. Please wait 30 seconds before posting again."; exit(); } } else { //ja nē, tad nepārbauda 30 sekundes, bet ievieto db. $sql_insert_1 = mysql_query("INSERT INTO `comments` (news_id, account_id, datetime, comment) VALUES ('$news_id', '$get_account_id', '$time_posted', '$comment')", $db); echo "OK"; exit(); } } else { echo "You didn't write your comment."; exit(); } } Vai komentāru pievienošana ir pietiekoši droša? Nekādas vairs injekcijas un mēsli nevar notikties? Ir vietas kur kaut ko var saīsināt? Mēģināju uztaisīt šo te perfekti. : D Edited November 26, 2009 by thesnarkie Quote Link to comment Share on other sites More sharing options...
briedis Posted November 26, 2009 Report Share Posted November 26, 2009 (edited) mysql_real_escape_string() funkcija ir jālieto pašās beigās, pirms liec datubāzē, tāpēc, ka ar citām funkcijām, kā piemēram tavā gadījumā - addslashes viņa tiek vienkārši "atcelta", kļūst bezjēdzīga. Vispār nafig tev tur ir addslashes? Man liekas, ir pareizāks veids, kā skaitīt cik ir ierakstu. $sql_3 = mysql_query("SELECT `id` FROM `comments` WHERE `account_id`='$get_account_id'", $db); $count_this_comments = mysql_num_rows($sql_3); Pareizāk: $sql_3 = mysql_query("SELECT count(*) as skaits FROM `comments` WHERE `account_id`='$get_account_id'", $db); $row = mysql_fetch_assoc($sql_3); echo $row['skaits']; Edited November 26, 2009 by briedis Quote Link to comment Share on other sites More sharing options...
thesnarkie Posted November 26, 2009 Author Report Share Posted November 26, 2009 (edited) Nezinu, man likās, ka vajag addslashes, lai būtu drošāk. : D (Izvadot izmantoju stripslases) Ok, ieliku real_escape_string pareizā vietā un nomainīju to rows skaitīšanu. Vispār, ja man ir vairāki tādi get: if($_GET['action'] == "comment") { //blala } if($_GET['action'] == "read") { //blalasdgsdfg } if($_GET['action'] == "delete") { //dlddd } Labāk tad izmantot switch-us? Edited November 26, 2009 by thesnarkie Quote Link to comment Share on other sites More sharing options...
Val Posted November 26, 2009 Report Share Posted November 26, 2009 Labāk tad izmantot switch-us?Nea, pietiks ar vienu.Ja atstāj IF'us, tad vismaz izmanto if-elseif-...-else, jo katru nosacījumu pārbaudīt nav prātīgi. Quote Link to comment Share on other sites More sharing options...
briedis Posted November 26, 2009 Report Share Posted November 26, 2009 Nu padomā loģiski - kāds jēga pie ievades likt addslashes un pie izvades likt stripslashes? Par likšanu DB drošību parūpējas real_esc_string... Quote Link to comment Share on other sites More sharing options...
rATRIJS Posted November 26, 2009 Report Share Posted November 26, 2009 It kā jau gana droši, bet nepārbauda vai ziņas kurām tiek pievienots komentārs eksistē. + current_user.id (lietotāja, kurš ir iežurnalējies) id var pieglabāt jau sesijā, lai nav jāsavāc no DB katru reizi exit() var likt arī pašās beigās, nevis pēc katra nosacījuma izpildes beigām. Un kādēļ tev tur vispār ir exit? Pareizi būtu pārmest lietotāju atpakaļ uz savu komentāru, bet nu ja te ir AJAX, tad OK. Quote Link to comment Share on other sites More sharing options...
thesnarkie Posted November 26, 2009 Author Report Share Posted November 26, 2009 (edited) Nea, pietiks ar vienu. Nu jā, jā vienu switch un case-iem. Bet ir kāda atšķirība if-i vai switch? It kā jau gana droši, bet nepārbauda vai ziņas kurām tiek pievienots komentārs eksistē. Ziņu id padod formā: <input type="hidden" name="news_id" value="<? echo $result_1['id'] ?>" /> Un tas ir gana droši (nu tādā ziņā, ka lietotājs var izmainīt to vērtību?) vai vajadzētu labāk pārbaudīt vai ziņas eksistē? + current_user.id (lietotāja, kurš ir iežurnalējies) id var pieglabāt jau sesijā, lai nav jāsavāc no DB katru reizi Tad nebūs tā, ka tāds gudrāks lietotājs iebāzīs citu id sesijā? Edited November 26, 2009 by thesnarkie Quote Link to comment Share on other sites More sharing options...
2easy Posted November 26, 2009 Report Share Posted November 26, 2009 haha addslashes() stripslashes()... jo vairāk samuhļīt datus, jo drošāk! :D kkāda iebiedēta cilvēka loģika, tipa "drošs paliek nedrošs" karo4e vienīgais, ko vajag izdarīt ar saņemtajiem datiem, kad formē db query, ir: (float) $_POST['te-ir-jaabuut-kkaadam-skaitlim'] mysql_real_escape_string($_POST['te-ir-kkaads-teksts']) un to pirmkārt vajag, nevis dēļ kkādām tur injekcijām, bet gan lai normāli sagatavotu datus ievietošanai db. piemēram, mysql_real_escape_string() lieto, lai parasts apostrofs atsūtītajā tekstā neizraisītu mysql erroru. ja datus pareizi apstrādā, tad arī ar drošību viss ir kārtībā. tas jau pēc tam izriet automātiski Quote Link to comment Share on other sites More sharing options...
rATRIJS Posted November 26, 2009 Report Share Posted November 26, 2009 Priekš SQL kvērijiem tas ta būtu tas vienīgais/svarīgākais, bet ne kopumā. Vajag nodrošināties arī pret citām injekcijām, kaut vai XHR vai vienkārši HTML :) un atkarībā no tā kas tiek taisīt var klāt nākt vēl n lietas. Quote Link to comment Share on other sites More sharing options...
2easy Posted November 26, 2009 Report Share Posted November 26, 2009 Bet ir kāda atšķirība if-i vai switch? pofig, loģika jau tā pati. lieto, kas tev ērtāk vai vajadzētu labāk pārbaudīt vai ziņas eksistē? no datu loģikas un korektuma viedokļa to vajadzētu pārbaudīt taču varbūtība, ka kāds mēģinās pievienot komentārus neeksistējošam rakstam, ir ļoti maza, jo ieguvuma ta no tā nekāda nav Tad nebūs tā, ka tāds gudrāks lietotājs iebāzīs citu id sesijā? lol, kko iebāzt sesijā vari tikai tu pats... Quote Link to comment Share on other sites More sharing options...
rATRIJS Posted November 26, 2009 Report Share Posted November 26, 2009 (edited) taču varbūtība, ka kāds mēģinās pievienot komentārus neeksistējošam rakstam, ir ļoti maza, jo ieguvuma ta no tā nekāda nav It kā jau nav liela vajadzība, bet var piesārņot DB ar bezjēdzīgiem datiem, kā arī taisīt pigorus pievienojot komentāru ar nākotnes news_id :) Ziņu id padod formā: <input type="hidden" name="news_id" value="<? echo $result_1['id'] ?>" /> Un tas ir gana droši (nu tādā ziņā, ka lietotājs var izmainīt to vērtību?) vai vajadzētu labāk pārbaudīt vai ziņas eksistē? Fakts - viss kas nāk no formām nav uzticams :) un to hidden vērtību var nomainīt ar JS vai vienkārši kāds var POSTēt random lietas ar random datiem uz tavu skriptu kaut vai no savas lapas. Tad nebūs tā, ka tāds gudrāks lietotājs iebāzīs citu id sesijā? Nop, drīzāk kāds var nospert session_id un uzdoties par kādu citu lietotāju :) Tādēļ vajadzētu session_id ģenerēt gana drošu ņemot vērā visādus parametrus. Edited November 26, 2009 by rATRIJS Quote Link to comment Share on other sites More sharing options...
thesnarkie Posted November 26, 2009 Author Report Share Posted November 26, 2009 un to hidden vērtību var nomainīt ar JS Nu, pieņemsim, ka var, tad kā es ar js varu paņemt get datus? Kad submito komentāru palaižas šis skripts, kas nosūtīja komentāru un to hidden news_id. $(document).ready(function() { $("#add_comment").submit(function(){ $("#comment_news_button").hide(); $(".ncomment_response").hide(); $(".ajax_loading").show(); var str = $(this).serialize(); $.post("/p_gamma/news/index.php?action=comment", str, function(msg){ $("#comment_news_button").show(); $(".ajax_loading").hide(); if(msg == "OK") { } else { var login_response = msg; $(".ncomment_response").show(); $(".ncomment_response").html(login_response); } }); return false; }); }); Tad kā te: $.post("/p_gamma/news/index.php?action=comment", str, function(msg){ tagad var piekabināt klāt news_id no url (http://yourstarchat.awardspace.co.uk/p_gamma/news/?action=read&news_id=18) ? Ja tu to tā domāji.. Quote Link to comment Share on other sites More sharing options...
rATRIJS Posted November 26, 2009 Report Share Posted November 26, 2009 Nē - es to domāju tā kā biju uzrakstījis. Lietotājs hidden lauku vērtības var nomainīt ar JS palīdzību. Tas ko atgriež $(this).serialize() jau būs ar nepareizo news_id vērtību. Quote Link to comment Share on other sites More sharing options...
thesnarkie Posted November 26, 2009 Author Report Share Posted November 26, 2009 Skaidrs, bet, lai nu viņi maina to id, tā pat nekas nesanāks, jo nodrošinājos pret komentāru rakstīšanu neeksistējošās ziņās. :D Quote Link to comment Share on other sites More sharing options...
2easy Posted November 26, 2009 Report Share Posted November 26, 2009 vo malacis ^^ Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.