Jump to content
php.lv forumi

Visiem $_GET


Artenis

Recommended Posts

Paldies, darbojas. Tikai atkal nonāču pie problēmas, kas liecina par nepareizu manu darbību, šēit:

$q_lapas_n_link = "SELECT * FROM $tb2 where id=".$_GET['link']."";

Tagad man jāprasa iespēja kā izbēgt no mysql_errora, ievadot adrešu joslā: ' vai " jo erroru met tā pat, kaut arī ir escape, protams loģiski kādēļ, bet tagad jādomā, kā no tā izbēģt! Kaut ja ievada, tad nekas nenotiek... tā kā draugiem.lv piemēram!

php.lv/f/ forumam ar labs risinājums, tik tāds gluži neder! :)

Link to comment
Share on other sites

Ir iespējams, uzlikt mysql_real_escape_string visiem $_GET?

Lai neķer lapa slimības no: ?id=' ?link='

Un nav katram jāraksta: mysql_real_escape_string($_GET['link'])

Var, bet idejiski tas ir nepareizi!

 

mysql_real_escape_string lieto priekš SQL izteiksmēm.

 

Bieži iesācēji nesaprot, kā apstrādāt stringus, manuprāt, ļoti vienkārši - postētos datus SQL ieliek apmēram šādi: "INSERT .... ..... '" . mysql_real_escape_string($_GET['teksts']) . "' ... ";

 

ja tas ir int datu tips, tad (int) $_GET['teksts'] - tur var būt viss kas, bet nekorektā gadījumā vienmēr būs 0, pat ja tāds mainīgais vispār nav definēts.

 

un izvada šādi:

 

<?= htmlspecialchars($teksts) ?>

 

Un viss, nav ne sql injekcijs, ne html garbage - ja kāds vadīs iekšā htmlu, tad viņš tā arī izvadīsies ārā. Viss, ko lietotājs ievadīs, tā arī saglabāsies datubāzē.

 

Un Tādas lietas kā strip_tags un strip_quotes ir paredzētas citiem mērķiem, tad, kad daži tegi ir atļauti, bet parasti tomēr izmanto [ un ] šim nolūkam.

 

Starp citu, Zend frameworks to visu izdara automātiski, un ja izmanto MVC, tad arī var izveidot automātisku funkciju, kas pie saglabāšanas pāriet pāri un saglabā, bet tas jau ir mazliet advancētāk.

Edited by Mr.Key
Link to comment
Share on other sites

_makeSafe() paredzēta ievietošanai iekš DB, makeSafe paredzēta outputam.

Man arī INT datu tips tiek laists cauri tāpat kā jebkurš teksts. Kāpēc ne?

 

	/**
* @desc Escape variable
* @param string $var
* @param boolean[optional] $singlequotes Lai aizvāktu singlequotes konkrētajam mainīgajam.
*/
function _makeSafe($var, $singlequotes = true)
{
	// Aizvāc automātiski saliktās slashes
	get_magic_quotes_gpc() ? $var = stripslashes($var) : null;
	// eskeipo
	return ($singlequotes ? "'".mysqli_real_escape_string($this->link,$var)."'" : mysqli_real_escape_string($this->link,$var));
} /* _makeSafe */
/**************************************************************************/

/**
* @desc Nodrošina drošu outputu
* @param string $var
*/
function makeSafe($var){
	return htmlentities($var,ENT_QUOTES,'utf-8');
} /* makeSafe */
/**************************************************************************/

Edited by Toms
Link to comment
Share on other sites

Man arī INT datu tips tiek laists cauri tāpat kā jebkurš teksts. Kāpēc ne?

Tāpēc, ka int tipus SQL kverijā nav jāliek pēdiņās.

Ja tev ir kverijs: SELECT * FROM tabule WHERE id = $id

Tad $id izlaižot tikai cauri mysql_escape_string, piemēram, $_GET['id'], kurš satur vienu pēdiņu ", dabūsi kveriju:

SELECT * FROM tabule WHERE id = \"

Kas ir invalīds.

Ja turpretī pieliksi priekšā (int), tad dabūsi ... WHERE id = 0, kas ir valīds.

mysql_escape_string ir jāpielieto string datu tipiem, nevis visiem. Žēl, ka vairums php/mysql programmētāju nesaprot un neprot izmantot pareizus datu tipus. Derētu visiem pamācīties paskālu/javu/C# kādus gadus 2 pirms ķerties pie php.

 

Cits variants, ja lieto mysqli interfeisu, ir lietot tos bind (vai kā tos tur sauca). Tad nekas nekad nebūs jāeskeipo.

Link to comment
Share on other sites

Tāpēc, ka tas ir lieki - konvertēt INT'us uz stringiem, lai pielietotu mysql_escape_string, jo INT'iem tas nav nepieciešams.

Lieka koda izpildīšana noteikti neko labu nerada. Vēl jo vairāk invalīdu kveriju sūtīšana - kam tas vispār ir vajadzīgs? Ļoti vienkārši var izmanto valīdus kverijus. Kamdēļ jārada slikts kods?

Link to comment
Share on other sites

×
×
  • Create New...