هێرشی (SQL Injection) – بهشی سێیهم: خۆپاراستن له هێرش
خۆپاراستن له هێرشی (SQL injection attack):
(تێبینی: له نموونهکان دوو زمانی بهرنامهڕێژی PHP و ASP.Net/C# بهکار دههێنین)
بۆ خۆپاراستن له هێرشی (SQL injection) پێویسته ئهو خاڵانهی خوارهوه جێبهجێ بکهین:
١- پشکنین و ڕاستکردنهوهی زانیاریی وهرگیراو له بهکارهێنهرهوه (input data validation).
٢- بهکارهێنانی دیاریکهر (parameters) که جۆری زانیارییهكهی دیاریکراو بێت (type safe).
٣- بهکارهێنانی ههژمار (account)ی که ڕێگهپێدانی دیاریکراو بێت تهنها بۆ پێویستییهكان.
٤- نیشاندانی کهمترین زانیاری بۆ بهکارهێنهر له کاتی ڕوودانی ههڵه له وهرگرتن یان له داکردنی زانیاری بۆ بنكهدراوه.
پشکنین و ڕاستکردنهوهی زانیاری (Input Data Validation):
ئهویش دوو بهشی ههیه:
١- ڕاستکردنهوهی زانیاری له لای ڕاژهکارهوه (Server side validation).
٢- ڕاستکردنهوهی زانیاری له لای ڕاژهخوازهوه (Client side validation) .
یهکهم: ڕاستکردنهوهی زانیاری له لای ڕاژهکارهوه (Server-side Validation):
بێ گومان ههرچهند ڕاستکردنهوهی زانیاری بکرێت له لای ڕاژهخوازهوه (client)، هیچ پشتی پێ نابهسترێت له لایهن ڕاژهکارهوه (server)، چونکه لهوانهیه بهکارهێنهر بتوانێت ڕێگه بدۆزێتهوه بۆ خۆلادان لهو ڕاستکردنهوهی که له لایهن ڕاژهخوازهوه له نێو کۆدی وێبپهڕدا ئهنجام دهدرێت، چونکه وێبپهڕهکه له بهردهستی خۆیهتی.
بۆ ڕاستکردنهوهی زانیاریی وهرگیراو له بهکارهێنهر باشترین ڕێگه ئهوهیه پشکنینی بۆ بکرێت بۆ؛ درێژی (length)، مهودا (range) ، شێوه (format) ، جۆر (type) . ههروهها به دیاریکردنی لیستی ئهو پیتانهی که ڕێگهپێدراون.
له وێبپهڕێکی ASP.Net ڕاستکردنهوه له لایهن ڕاژهخوازهوه دهکرێت به بهکارهێنانی کۆنترۆلهکانی ڕاستکردنهوهی زانیاری (validation controls) وهکوو (RegularExpressionValidator control) و (RangeValidator control) له کاتێک ئهگهر بۆ وهرگرتنی زانیاری کۆنترۆلی ڕاژهکارهوه (server controls) بهکار دههات وهکوو کۆنترۆلهکانی (ASP.Net).
بهڵام ئهگهر (HTML) بهکار دههات ئهو کاته کلاسی (class) Regex له (.Net Framework) بهکار دههێنین بۆ ئهو مهبهسته.
له وێبپهڕێک که کۆدی PHP له ناوی بهکار دههات ئهو کاته کردارهکانی function set) ereg) یان preg بهکار دههێندرێت بۆ پشکنینی زانیاری، بۆ زانیاریی زیاتر لهسهر کردارهکانی ereg سهر لهم بهستهره بده:
ereg
، ئهم بهستهرهش بۆ preg_match
preg_match
(تێبینی: له ASP.Net ههمان کۆنترۆلهکانی ڕاستکردنهوهی زانیاری (validation controls) بۆ ڕاستکردنهوهی زانیاری له لای ڕاژهکار (server-side validation) و ڕاژهخوازهوه (client-side validation) بهکار دێت، بۆ ئهوهی ههر یهک لهو کۆنترۆڵانه تهنها ڕاستکردنهوهی زانیاری بکات له لای ڕاژهکارهوه ئهوه دهبێت تایبهتمهندی (EnableClientScript = False) یهکسان به (False) دابنێی.)
بهکارهێنانی (RegularExpressionValidatior) له ASP.Net:
<%@ language="C#" %> <form id="form1" runat="server"> <asp:TextBox ID="txtemail" runat="server"/> <asp:RegularExpressionValidator ID="regexemail" runat="server" ErrorMessage="Incorrect email name" ControlToValidate="txtemail" ValidationExpression = “((\%3D)|(=))[^\n]*((\%27)|(\')|(\-\-)|(\%3B)|(;))” </form>
له بهکارهێنانی (RegualrExpressionValidator) تهنها پێویستیمان به دیاریکردنی دوو تایبهتمهندییه (Property)، له نموونهی سهرهوه بڕوانه یهکهمیان (ControlToValidate) که ناوی ئهو کۆنترۆلهی (control) لهناو دهنووسین که دهمانهوێت پشکنینی ڕیزبهندی بۆ بکرێت بهگوێرهی یاسایهک که له تایبهتمهندیی دووهم دیاریی دهکهین (ValidationExpression). له نموونهی سهرهوه ئهو نرخهی که دیاریمان کردووه بۆ ئهو تایبهتمهندییه “((\%3D)|(=))[^\n]*((\%27)|(\’)|(\-\-)|(\%3B)|(;))” پشکنین دهکات بۆ ههبوونی هێمای یهکسان =، پاشان ئهگهر ههبوو پشکنین دهکات بۆ نهبوونی هێمای خهتێکی تازه (new line)، ههروهها پشکنین دهکات بۆ هێماکانی ( ‘ – ; ).
بهگوێرهی ئهوهی له سهرهوه باسمان کردبوو پێویسته پشکنین بکرێت بۆ ههر زانیارییهكی وهرگیراو له بهکارهێنهر بۆ؛ درێژی، مهودا، شێوه، جۆر. بهڵام نموونهکهی سهرهوه ئهوهمان بۆ ناکات، بهڵکوو تهنها پشکنین دهکات بۆ نهبوونی چهند پیتێکی زیانبهخش، ئهوه ڕێگهیهکی باش نییه، تهنها لهو کاته دهبێت که نهتوانین ئهو چوار پشکنینه (درێژی، مهودا، شێوه، جۆر) ئهنجام بدهین، بۆ ههر بارێکی دیاریکراو دهبێت پشکنینێکی دیاریکراوی بۆ بکهین، یهکهم دهبێت پشکنین بکهین درێژیی ڕسته وهرگیراوهکه زیاد نییه له پێویست، له مهودای پیته ڕێپێدراوهکان دهرنهچووه، شێوهی وهکوو داواکراوه بۆ نموونهی ئیمێل بهو شێوهیهیه ([email protected])، ههروهها جۆر، ئهگهر له textbox ێک چاوهڕێی ژماره دهکهیت پشکنین بۆ زانیاریی وهرگیراو دهکهین که ژمارهیه، ئهگهر کات بێت پشکنینی بۆ دهکهین که کاته، … هتد بهو شێوهیه.
له خوارهوه چهند نموونهیهک ههیه لهسهر ڕێزبهندی پشکنینی چهند جۆرێکی زانراو له زانیاری:
بۆ ناو به پیتی ئینگلیزی:
ValidationExpression="[a-zA-Z'.`-´\s]{1,40}”
شیکردنهوه:
ئهو ڕیزبهندهی سهرهوه ڕێ دهدات به بهکارهێنانی پیتهکانی (a-z A-Z ‘ . ` – ´ space) ههروهها درێژییهكی له نێوان 1-40 پیت بێت.
بۆ ئیمێل:
ValidationExpression = "^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)| (([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$”
بۆ بهستهری ئینتهرنێت:
ValidationExpression=”^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3} (:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*$”
بۆ زیاتر زانین دهربارهی دروستکردنی ڕیزبهندی پشکنین به بهکارهێنانی یهکهکانی زمانی پشکنینی زانیاری (Regular Expression Language Elelments) سهر لهو بهستهرانهی خوارهوه بده:
MSDN: Regular Expression Language Elements
Regular Expression Tutorial
Regular Expression Basic Syntax Reference
له ڕاستکردنهوهی زانیاریی وهرگیراو له بهکارهێنهر دهبێ ئهوهش لهبهر چاو بگرین که دهکرێت (شهكرۆكه cookie) بهکاربێت بۆ ئهنجامدانی هێرشی (SQL injection)، به شێوهیهکی گشتی ههموو زانیارییهك که له ڕاژهخوازهوه بگهڕێتهوه بۆ ڕاژهکار پێویستی به پشکنینه، بۆ مهبهستی پشکنینی زانیاری گهڕاوه بۆ ڕاژهکار له (شهكرۆكه cookie) یان ڕیزبهندی داواکاری (query string)، یان به ههر ڕێگهیهکی دیکه کلاسی (class Regex) بهکار دههێنین له (ASP.Net) و کرداری ereg یان preg_match بهکار دههێنین له PHP.
بهکارهێنانی کلاسی Regex بۆ کۆنترۆڵهکانی HTML و (شهكرۆكه cookie) و جۆرهکانی دیکهی زانیاریوهرگرتن له ڕاژهخوازهوه بۆ ڕاژهکار:
Regex بهو شێوهی خوارهوه بهکار دێت:
بۆ کۆنترۆڵی textbox
if (!Regex.IsMatch(txtName.Text, @"[a-zA-Z'.`-´\s]{1,40}”) { // Invalid name handling code }
بۆ ڕیزبهندی داواکاری (Query String)
if (!Regex.IsMatch(Request.QueryString[“name”], @"[a-zA-Z'.`-´\s]{1,40}”) { // Invalid name handling code }
بۆ کووکی (cookie)
if (!Regex.IsMatch(Request.Cookies[“name”], @"[a-zA-Z'.`-´\s]{1,40}”) { // Invalid name handling code }
بهکارهێنانی کرداری preg_match بۆ ڕاستکردنهوهی زانیاری له وێبپهڕی PHP
بهکارهێنانی preg_match
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) { $result = mysql_query("SELECT * FROM users WHERE username=$matches[0]"); } else { //handle bad input echo "username not accepted"; }
دووهم: ڕاستکردنهوهی زانیاری له لای ڕاژهخوازهوه(Client side validation) :
ئهگهرچی ڕاستکردنهوهی زانیاری له لای ڕاژهخوازوهوه (client side validation) کێشهکانی زانیاریوهرگرتن له بهکارهێنهر چارهسهرناکات، بهڵام چهندین سوودی ههیه، لهو سوودانهی وا دهکات بهکارهێنهر ڕاستهوخۆ ههڵهکانی ببینێت لهکاتی نووسین بهبێ ئهوهی پێویست بکات لاپهڕهکه بنێریتهوه بۆ ڕاژهکار (post back) که ئهوه ئهرک کهم دهکاتهوه ههم لهسهر ڕاژهکارو ههم لهسهر هێڵی ئینتهرنێت، ههروهها وا دهکات بهکارهێنهر زوو فێر بێت به ڕاست و درووستی وێبگهکه بهکار بهێنیت.
بۆ ئهنجامدانی ڕاستکردنهوهی زانیاری له لای ڕاژهخوازهوه له وێبپهڕی ASP.Net سوود له کۆنترۆلهکانی ڕاستکردنهوهی زانیاری وهردهگرین (validation controls)، بهههمان شێوه دهتوانین (RegularExpressionValidator control) بهکار بهێنین بۆ ئهم مهبهسته تهنها دهبێت لهبیر نهکهین تایبهتمهندی (EnableClientScript = True) دیاری بکهین، ئهو کاته ڕاژهکاری ASP.Net ههڵدهستێت به دروستکردنی سکریپتی Java لهناو لاپهڕهکهت بۆ ئهنجامدانی ڕاستکردنهوهی زانیاری له لای ڕاژهکار.
له ASP.Net چهند کۆنترۆلێک ههیه که بهسوودن بۆ ئهو مهبهسته وهک: (RangeValidator, RequiredFailedValidator, CompareValidator, CustomValidator) که ههموو ئهوانه دهکرێت بهکاربێت بۆ ڕاستکردنهوهی زانیاری له لای ڕاژهخوازهوه.
بۆ لاپهڕهی PHP پێویسته جاڤاسکریپت Javascript بهکاربهێنین بۆ ئهو مهبهسته، له نموونهی خوارهوه چۆنیهتیی بهکارهێنانی Regular Expression له زمانی Javascript دهردهکهوێت.
<script language="JavaScript1.2"> function validateInputs () { //Declare regular expression var emailRegEx = new RegExp(' ^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)| (([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$ '); //Match textbox value to Regular Expression if (document.getElementById('txtemail').value.match(emailRegEx)) { document.getElementById('txtemail').focus(); alert("The Year field must be over 2000."); return false; } } </script> <form action="destination" method="post" name="form" onsubmit="return validateInputs();"> Enter your email <input type="text" name="email" value=""> <input type="submit" name="submit" value="submit"> </form>
بۆ زانیاریی زیاتر لهسهر ڕاستکردنهوهی زانیاری له لای ڕاژهخوازهوه:
Dynamic Client-Side Input Validation
له بهشی داهاتوو باس لهخاڵهکانی دیکهی خۆپاراستن دهکهین.