{"id":1975,"date":"2013-02-12T15:08:19","date_gmt":"2013-02-12T14:08:19","guid":{"rendered":"http:\/\/www.plagosus.net\/blog\/?p=1975"},"modified":"2013-02-12T15:10:18","modified_gmt":"2013-02-12T14:10:18","slug":"koristite-mysqli-i-prepared-statements-kao-zastitu-od-sql-injection-napada","status":"publish","type":"post","link":"https:\/\/www.plagosus.net\/blog\/dev\/php-programiranje\/koristite-mysqli-i-prepared-statements-kao-zastitu-od-sql-injection-napada\/","title":{"rendered":"Koristite MySQLi i Prepared Statements kao za\u0161titu od SQL Injection napada"},"content":{"rendered":"<p style=\"text-align: justify;\">Svima nam je poznata \u010dinjenica da se tehnologija jako brzo razvija, posebno kada su ra\u010dunari u pitanju. Za hardver postoji \u010dak i dobro poznati <a href=\"http:\/\/sr.wikipedia.org\/sr-el\/Murov_zakon\" target=\"_blank\"><em>Murov zakon<\/em><\/a> koji ka\u017ee da se &#8220;<em>snaga ra\u010dunara udvostru\u010duje pribli\u017eno svakih 18-24 meseca<\/em>&#8220;, dok je u softverskim vodama siutacija malo druga\u010dija. U teroriji je svaka novina momentalno dostupna svim ljudima \u0161irom planete, a sve uz pomo\u0107 Interneta, me\u0111utim u realnosti i nije ba\u0161 tako. Ovih dana konvertujem neki stari kod pa sam re\u0161io da ovo podelim sa vama.<\/p>\n<p style=\"text-align: justify;\"><strong>MySQLi<\/strong> je tema o kojoj se u najve\u0107e pri\u010dalo jo\u0161 2008. i 2009. godine, a evo posle 5 godina i dalje nije prihva\u0107ena u potpunosti. Zato je ovaj tekst namenjem mladim kolegama koji se tek upu\u0161taju u web development vode, \u010disto da na jednostavnom primeru nau\u010de kako se koriste <strong>MySQLi i pripremljene naredbe<\/strong>.<\/p>\n<h2 style=\"text-align: justify;\">\u0160ta su &#8220;MySQLi&#8221; i &#8220;Prepared Statements&#8221; i \u010demu slu\u017ee<\/h2>\n<p style=\"text-align: justify;\"><strong>MySQLi<\/strong> je, jednostavno re\u010deno, dodatak za PHP (od <a href=\"http:\/\/php.net\/manual\/en\/mysqli.installation.php\" target=\"_blank\">verzije 5.0.0<\/a> je uklju\u010den u standardnu instalaciju) kojim se pristupa svim naprednim funkcijama uvedenim u <a href=\"http:\/\/dev.mysql.com\/\" target=\"_blank\">MySQL Server<\/a>, po\u010dev\u0161i od verzije 4.1.3 doti\u010dnog servera.<\/p>\n<blockquote>\n<p style=\"text-align: justify;\">If you are using MySQL versions 4.1.3 or later it is strongly recommended that you use the mysqli extension instead.<\/p>\n<\/blockquote>\n<p style=\"text-align: justify;\">Ranije se koristio MySQL dodatak za upite nad bazom, pa se slovo &#8220;i&#8221; u nazivu odnosti na &#8220;<em>improved<\/em>&#8220;, tj &#8220;<em>pobolj\u0161an<\/em>&#8220;. Razlozi za kori\u0161\u0107enje novog dodatka su mnogobrojni:<\/p>\n<ul>\n<li><span style=\"line-height: 15px;\"><strong>Odr\u017eavanje koda<\/strong> kod stare verzije je postalo problemati\u010dno jo\u0161 pre nego \u0161to je Oracle preuzeo MySQL, pa je bezbednije koristiti novu;<\/span><\/li>\n<li><strong>Sli\u010dna sintaksa<\/strong> \u0107e skakako pomo\u0107i onima koji su koristili staru verziju da se sna\u0111u i na novoj;<\/li>\n<li><strong>Novi interfejsi<\/strong>\u00a0su posebno zgodni jer se MySQLi mo\u017ee koristiti i proceduralno (sli\u010dno kao stari mysql dodatak) i objektno, \u010dime se iskori\u0161\u0107ava pun potencijal\u00a0PHP5 programskog jezika;<\/li>\n<li><strong>Napredne opcije<\/strong> po\u010dev\u0161i od od samih pode\u0161avanja prilikom inicijalizacije;<\/li>\n<li><strong>Brzina<\/strong> je ono \u0161to korisnici velikih i\/ili optere\u0107enih baza podataka znaj da cene;<\/li>\n<li><strong>Sigurnost<\/strong>\u00a0je pobolj\u0161ana na vi\u0161e na\u010dina, od promenjenog binarnog protokola u MySQL-u, do kori\u0161\u0107enja pripremljenih naredbi (<em>prepared statements<\/em>);<\/li>\n<li><strong>Transakcije i atomi\u010dne operacije<\/strong> su kona\u010dno implementirane u postpunosti.<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Za detaljni pregled mogu\u0107nosti pogledajte <a href=\"http:\/\/www.php.net\/manual\/en\/intro.mysqli.php\" target=\"_blank\">PHP: Introduction &#8211; Manual<\/a>.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/php.net\/manual\/en\/mysqli.quickstart.prepared-statements.php\" target=\"_blank\"><strong>Prepared Statements<\/strong><\/a> predstavljaju &#8216;<em>pripremljene naredve<\/em>&#8216; tj mogu\u0107nost da unapred defini\u0161ete upite nad bazom, a da dinami\u010dke argumente prosle\u0111ujete kasnije, na sigurniji na\u010din nego ina\u010de, \u010dime sistem \u0161titite od klasi\u010dnih <em>SQL Injection<\/em> napada.<\/p>\n<blockquote>\n<p style=\"text-align: justify;\">Prepared statements are the ability to set up a statement once, and then execute it many times with different parameters.<\/p>\n<\/blockquote>\n<p style=\"text-align: justify;\">Postoje dva tipa pripremljenih naredbi: &#8220;<em>bound parameter<\/em>&#8221; i &#8220;<em>bound result<\/em>&#8220;, ali su nam za zaptitu od SQL Injection napada zanimljivi samo prvi pa \u0107u dati primer sa njima.<\/p>\n<p style=\"text-align: justify;\">Dakle, MySQLi koristite zbog svojih mnogobrojnih prednosti (a stari mysql \u0107e i onako biti <a href=\"http:\/\/php.net\/manual\/en\/function.mysql-query.php\" target=\"_blank\">izba\u010den od verzije PHP 5.5.0<\/a>) a prepared statements je novi saveznik u borbi protiv SQL Injection napada.<\/p>\n<h2 style=\"text-align: justify;\">Primer MySQLi Prepared Statements upita na bazu iz PHP-a<\/h2>\n<p style=\"text-align: justify;\">Kao \u0161to iz prilo\u017eenog primera mo\u017eete primetiti, procedura je slede\u0107a: kreirate novi <span style=\"color: #3366ff;\">$mysqli<\/span> objekat kojim se konektujete na bazu, pa zatim pripremite SQL upit bez konkretnih parametara, umesto kojih ostavite znak(e) pitanja. Zatim <a href=\"http:\/\/php.net\/manual\/en\/mysqli-stmt.bind-param.php\" target=\"_blank\">\u017eeljene parametre dodate<\/a> (<em>bind<\/em>) na pripremljeni upit, prilikom \u010dega defini\u0161ete i tip podka koji prosle\u0111ujete (i &#8211; integer, d -double, s -string, b &#8211; blob) i tek onda zapravo izvr\u0161ite upit. Na kraju pokupite rezultat upita i upi\u0161ete ga u \u017eeljenu promenljivu (ili vi\u0161e njih).<\/p>\n<p>[php]<\/p>\n<p>&lt;?php<br \/>\n\/\/ Example of MySQLi and Prepared Statements<br \/>\n\/\/ save this file as example.php<br \/>\n\/\/ access it with example.php?userid=13 for example<\/p>\n<p>\/\/ Databse constants<br \/>\ndefine(&#8220;DB_SERVER&#8221;, &#8220;localhost&#8221;);<br \/>\ndefine(&#8220;DB_USER&#8221;, &#8220;root&#8221;);<br \/>\ndefine(&#8220;DB_PASS&#8221;, &#8220;&#8221;);<br \/>\ndefine(&#8220;DB_NAME&#8221;, &#8220;testdb&#8221;);<\/p>\n<p>\/\/ New DB connection<br \/>\n$mysqli = new mysqli(DB_SERVER, DB_USER, DB_PASS, DB_NAME);<br \/>\nif ($mysqli-&gt;connect_errno) {<br \/>\n    echo &#8220;Failed to connect to MySQL: &#8221; . $mysqli-&gt;connect_error;<br \/>\n}<\/p>\n<p>\/\/ Prepared query with ? as placeholder for parameters<br \/>\n$query = &#8220;SELECT user_tel, user_email FROM users WHERE user_id = ?;&#8221;;<\/p>\n<p>\/\/ Set $userid variable<br \/>\nif (isset($_GET[&#8216;userid&#8217;])) {<br \/>\n    $user_id = $_GET[&#8216;userid&#8217;];<br \/>\n} else {<br \/>\n    $user_id = 1;<br \/>\n}<\/p>\n<p>\/\/ Get instance of statement<br \/>\n$statement = $mysqli-&gt;stmt_init();<\/p>\n<p>\/\/ Prepare Query<br \/>\nif ($statement-&gt;prepare($query)) {<\/p>\n<p>    \/\/ Bind Parameters &#8211; i for integer<br \/>\n    $statement-&gt;bind_param(&#8216;i&#8217;, $user_id);<\/p>\n<p>    \/\/ Execute the query<br \/>\n    $statement-&gt;execute();<\/p>\n<p>    \/\/ Bind result variables<br \/>\n    $statement-&gt;bind_result($tel, $email);<\/p>\n<p>    \/\/ Fetch Value<br \/>\n    while ($statement-&gt;fetch()) {<br \/>\n        echo &#8220;Tel: &#8220;.$tel.&#8221;\\n&#8221;;<br \/>\n        echo &#8220;Email: &#8220;.$email.&#8221;&lt;br \/&gt;\\n&#8221;;<br \/>\n    }<\/p>\n<p>    \/\/ Close statement<br \/>\n    $statement-&gt;close();<br \/>\n}<\/p>\n<p>\/\/ Close connection<br \/>\n$mysqli-&gt;close();<\/p>\n<p>?&gt;<br \/>\n[\/php]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Primer kori\u0161\u0107enja MySQLi Prepared Statements u PHP5 za za\u0161titu od SQL Injection napada<\/p>\n","protected":false},"author":2,"featured_media":1984,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[148],"tags":[93,234,237,235,122,236],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.plagosus.net\/blog\/wp-json\/wp\/v2\/posts\/1975"}],"collection":[{"href":"https:\/\/www.plagosus.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.plagosus.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.plagosus.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.plagosus.net\/blog\/wp-json\/wp\/v2\/comments?post=1975"}],"version-history":[{"count":0,"href":"https:\/\/www.plagosus.net\/blog\/wp-json\/wp\/v2\/posts\/1975\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.plagosus.net\/blog\/wp-json\/wp\/v2\/media\/1984"}],"wp:attachment":[{"href":"https:\/\/www.plagosus.net\/blog\/wp-json\/wp\/v2\/media?parent=1975"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.plagosus.net\/blog\/wp-json\/wp\/v2\/categories?post=1975"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.plagosus.net\/blog\/wp-json\/wp\/v2\/tags?post=1975"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}