Jump to content
php.lv forumi

komentāru pievienošanas skripta drošība.


thesnarkie

Recommended Posts

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 by thesnarkie
Link to comment
Share on other sites

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 by briedis
Link to comment
Share on other sites

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 by thesnarkie
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 by thesnarkie
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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...

Link to comment
Share on other sites

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 by rATRIJS
Link to comment
Share on other sites

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..

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...