බොහෝ ප්රයෝජනවත් පිළිතුරු සම්බන්ධයෙන්, මෙම ත්රෙඩ් එකට යම් වටිනාකමක් එක් කිරීමට මම බලාපොරොත්තු වෙමි.
SQL එන්නත් කිරීම යනු පරිශීලක යෙදවුම් හරහා කළ හැකි ප්රහාරයකි (පරිශීලකයෙකු විසින් පුරවා පසුව විමසුම් තුළ භාවිතා කරන යෙදවුම්). SQL එන්නත් කිරීමේ රටා නිවැරදි විමසුම් වාක්ය ඛණ්ඩයක් ලෙස අපට හැඳින්විය හැකිය: නරක හේතු සඳහා නරක විමසීම්, සහ ආරක්ෂිත මූලධර්ම තුනට (රහස්යභාවයට) බලපාන රහස් තොරතුරු (ප්රවේශ පාලනය මඟ හැරීම) ලබා ගැනීමට උත්සාහ කරන නරක පුද්ගලයෙක් සිටිය හැකි යැයි අපි උපකල්පනය කරමු. , අඛණ්ඩතාව සහ උපයෝජ්යතාව).
දැන්, අපගේ අදහස වන්නේ SQL එන්නත් කිරීමේ ප්රහාර වැනි ආරක්ෂක තර්ජන වැළැක්වීම, ප්රශ්නය ඇසීම (PHP භාවිතා කරමින් SQL එන්නත් කිරීමේ ප්රහාරයක් වළක්වා ගන්නේ කෙසේද), වඩාත් යථාර්ථවාදී වීම, දත්ත පෙරීම හෝ ආදාන දත්ත ඉවත් කිරීම යනු පරිශීලක ආදාන දත්ත ඇතුළත භාවිතා කරන විට ය. එවැනි විමසුමක්, PHP හෝ වෙනත් ක්රමලේඛන භාෂාවක් භාවිතා කිරීම එසේ නොවේ, නැතහොත් සූදානම් කළ ප්රකාශය හෝ දැනට SQL එන්නත් කිරීම වැළැක්වීමට සහාය වන වෙනත් මෙවලම් වැනි නවීන තාක්ෂණය භාවිතා කිරීමට වැඩි පිරිසක් නිර්දේශ කර ඇති පරිදි, මෙම මෙවලම් තවදුරටත් ලබා ගත නොහැකි යැයි සලකනවාද? ඔබගේ අයදුම්පත සුරක්ෂිත කරන්නේ කෙසේද?
SQL එන්නත් කිරීමට එරෙහි මගේ ප්රවේශය නම්: දත්ත සමුදායට යැවීමට පෙර පරිශීලක ආදාන දත්ත ඉවත් කිරීම (ඕනෑම විමසුමක් තුළ එය භාවිතා කිරීමට පෙර).
සඳහා දත්ත පෙරීම (අනාරක්ෂිත දත්ත ආරක්ෂිත දත්ත බවට පරිවර්තනය කිරීම)
PDO සහ MySQLi සලකා බලන්න ලබා ගත නොහැකි . ඔබගේ යෙදුම සුරක්ෂිත කරන්නේ කෙසේද? ඒවා භාවිතා කිරීමට ඔබ මට බල කරනවාද? PHP හැර වෙනත් භාෂා ගැන කුමක් කිව හැකිද? විශේෂිත භාෂාවක් සඳහා පමණක් නොව පුළුල් මායිම සඳහා භාවිතා කළ හැකි බැවින් සාමාන්ය අදහස් සැපයීමට මම කැමැත්තෙමි.
- SQL පරිශීලකයා (පරිශීලක වරප්රසාදය සීමා කිරීම): වඩාත් සුලභ SQL මෙහෙයුම් (SELECT, UPDATE, INSERT), එසේ නම්, UPDATE වරප්රසාදය අවශ්ය නොවන පරිශීලකයෙකුට ලබා දෙන්නේ ඇයි? උදාහරණයක් ලෙස, පිවිසුම් සහ සෙවුම් පිටු භාවිතා කරන්නේ SELECT පමණි, එසේ නම්, ඉහළ වරප්රසාද සහිත මෙම පිටුවල DB භාවිතා කරන්නන් භාවිතා කරන්නේ ඇයි?
රීතිය: සියලු වරප්රසාද සඳහා එක් දත්ත සමුදා පරිශීලකයෙකු නිර්මාණය නොකරන්න. සියලුම SQL මෙහෙයුම් සඳහා, ඔබට පහසුවෙන් භාවිතා කිරීම සඳහා පරිශීලක නාමයන් ලෙස (deluser, selectuser, updateuser) වැනි යෝජනා ක්රමයක් නිර්මාණය කළ හැකිය.
අවම වරප්රසාදයේ මූලධර්මය බලන්න .
දත්ත පෙරීම: ඕනෑම විමසුම් පරිශීලක ආදානයක් තැනීමට පෙර, එය වලංගු කර පෙරහන් කළ යුතුය. ක්රමලේඛකයින් සඳහා, එක් එක් පරිශීලක ආදාන විචල්යයන් සඳහා සමහර ගුණාංග නිර්වචනය කිරීම වැදගත් ය:
දත්ත වර්ගය, දත්ත රටාව සහ දත්ත දිග . (X සහ y) අතර සංඛ්යාවක් ඇති ක්ෂේත්රයක් නිශ්චිත රීතිය භාවිතයෙන් නිවැරදිව වලංගු කළ යුතු අතර, නූලක් (පෙළ) ඇති ක්ෂේත්රයක් සඳහා: රටාව එයයි, උදාහරණයක් ලෙස, පරිශීලක නාමයක අඩංගු විය යුත්තේ අක්ෂර කිහිපයක් පමණි, අපි [a-zA-Z0-9_-.] කියන්න. X සහ n (නිඛිල, x <= n) අතර දිග (x සහ n) අතර වෙනස් වේ.
රීතිය: නිශ්චිත පෙරහන් නිර්මාණය කිරීම සහ වලංගු කිරීමේ නීති මට හොඳම භාවිතයන් වේ.
වෙනත් මෙවලම් භාවිතා කරන්න: මෙන්න, සූදානම් කළ ප්රකාශයක් (පරාමිතිගත විමසුම) සහ ගබඩා කළ ක්රියා පටිපාටි පිළිබඳව මම ඔබ සමඟ එකඟ වෙමි. මෙහි ඇති අවාසි නම් මෙම ක්රම බොහෝ පරිශීලකයින් සඳහා නොපවතින උසස් කුසලතා අවශ්ය වේ. මෙහි මූලික අදහස වන්නේ SQL විමසුම සහ ඇතුළත භාවිතා වන දත්ත අතර වෙනස හඳුනා ගැනීමයි. මෙම ප්රවේශයන් දෙකම අනාරක්ෂිත දත්ත සමඟ පවා භාවිතා කළ හැකිය, මන්ද මෙහි පරිශීලක ආදාන දත්ත (ඕනෑම හෝ x = x) වැනි මුල් විමසුමට කිසිවක් එකතු නොකරයි.
වැඩි විස්තර සඳහා කරුණාකර කියවන්න OWASP SQL එන්නත් වැළැක්වීමේ වංචා පත්රය කියවන්න .
දැන්, ඔබ දියුණු පරිශීලකයෙක් නම්, ඔබ කැමති පරිදි මෙම ආරක්ෂාව භාවිතා කිරීම අරඹන්න, නමුත් ආරම්භකයින් සඳහා, ගබඩා කළ ක්රියා පටිපාටියක් ඉක්මණින් ක්රියාත්මක කර ප්රකාශය සකස් කිරීමට ඔවුන්ට නොහැකි නම්, ආදාන දත්ත ඔවුන්ට හැකි තරම් පෙරීම වඩා හොඳය.
අවසාන වශයෙන්, පරිශීලකයෙකු ඔහුගේ / ඇයගේ පරිශීලක නාමය ඇතුළත් කිරීම වෙනුවට මෙම පා text ය පහළින් යවන බව සලකා බලමු:
[1] UNION SELECT IF(SUBSTRING(Password,1,1)='2',BENCHMARK(100000,SHA1(1)),0) User,Password FROM mysql.user WHERE User = 'root'
මෙම ආදානය කිසිදු සූදානම් කළ ප්රකාශයක් සහ ගබඩා කළ ක්රියා පටිපාටියක් නොමැතිව කල්තියා පරීක්ෂා කළ හැකි නමුත් ආරක්ෂිත පැත්තේ සිටීම සඳහා, ඒවා භාවිතා කිරීම පරිශීලක දත්ත පෙරීම සහ වලංගු කිරීමෙන් පසුව ආරම්භ වේ.
අවසාන කරුණ නම් වැඩි උත්සාහයක් හා සංකීර්ණත්වයක් අවශ්ය වන අනපේක්ෂිත හැසිරීම් හඳුනා ගැනීමයි; සාමාන්ය වෙබ් යෙදුම් සඳහා එය නිර්දේශ නොකරයි.
ඉහත පරිශීලක ආදානයේ අනපේක්ෂිත හැසිරීම වන්නේ SELECT, UNION, IF, SUBSTRING, BENCHMARK, SHA සහ root ය. මෙම වචන අනාවරණය වූ පසු, ඔබට ආදානය වළක්වා ගත හැකිය.
යාවත්කාලීන කිරීම 1:
පරිශීලකයෙකු අදහස් දක්වමින් මෙම සටහන නිෂ් less ලයි, හරි! OWASP.ORG විසින් සපයන ලද දේ මෙන්න :
ප්රාථමික ආරක්ෂක:
විකල්ප # 1: සකස් කළ ප්රකාශ භාවිතා කිරීම (පරාමිතිගත විමසුම්)
විකල්පය # 2: ගබඩා කළ ක්රියා පටිපාටි භාවිතා කිරීම
විකල්පය # 3: සියලු පරිශීලක සැපයුම් ආදානයන් මග හැරීම
අතිරේක ආරක්ෂාවන්:
එසේම බලාත්මක කරන්න: අවම වරප්රසාදය
ද සිදු කරන්න: සුදු ලැයිස්තු ආදාන වලංගුකරණය
ඔබ දන්නා පරිදි, ලිපියක් ඉල්ලා සිටීම වලංගු තර්කයකින්, අවම වශයෙන් එක් සඳහනකින්වත් සහාය විය යුතුය! එසේ නොමැති නම්, එය ප්රහාරයක් සහ නරක ප්රකාශයක් ලෙස සැලකේ!
යාවත්කාලීන 2:
PHP අත්පොතෙන්, PHP: සකස් කළ ප්රකාශ - අත්පොත :
පැන යාම සහ SQL එන්නත් කිරීම
මායිම් විචල්යයන් සේවාදායකයා විසින් ස්වයංක්රීයව ගැලවී යනු ඇත. ක්රියාත්මක කිරීමට පෙර සේවාදායකයා ඔවුන්ගේ ගැලවී ගිය අගයන් සුදුසු ස්ථානවල ප්රකාශන අච්චුවට ඇතුළත් කරයි. සුදුසු පරිවර්තනයක් නිර්මාණය කිරීම සඳහා බැඳී ඇති විචල්ය වර්ගය සඳහා ඉඟියක් සේවාදායකයට ලබා දිය යුතුය. වැඩි විස්තර සඳහා mysqli_stmt_bind_param () ශ්රිතය බලන්න.
SQL එන්නත් කිරීම වැළැක්වීම සඳහා සේවාදායකය තුළ ඇති අගයන් ස්වයංක්රීයව ගැලවී යාම සමහර විට ආරක්ෂක අංගයක් ලෙස සැලකේ. ආදාන අගයන් නිවැරදිව ගැලවී ගියහොත් සකස් නොකළ ප්රකාශවලින් එකම මට්ටමේ ආරක්ෂාවක් ලබා ගත හැකිය.
යාවත්කාලීන 3:
සූදානම් කළ ප්රකාශයක් භාවිතා කරන විට PDO සහ MySQLi විසින් MySQL සේවාදායකයට විමසුම යවන්නේ කෙසේදැයි දැන ගැනීම සඳහා මම පරීක්ෂණ අවස්ථා නිර්මාණය කළෙමි:
PDO:
$user = "''1''"; // Malicious keyword
$sql = 'SELECT * FROM awa_user WHERE userame =:username';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':username' => $user));
විමසුම් ලොගය:
189 Query SELECT * FROM awa_user WHERE userame ='\'\'1\'\''
189 Quit
MySQLi:
$stmt = $mysqli->prepare("SELECT * FROM awa_user WHERE username =?")) {
$stmt->bind_param("s", $user);
$user = "''1''";
$stmt->execute();
විමසුම් ලොගය:
188 Prepare SELECT * FROM awa_user WHERE username =?
188 Execute SELECT * FROM awa_user WHERE username ='\'\'1\'\''
188 Quit
සූදානම් කළ ප්රකාශයක් ද දත්ත වලින් ගැලවී යන බව පැහැදිලිය, වෙන කිසිවක් නැත.
ඉහත ප්රකාශයේ සඳහන් පරිදි,
SQL එන්නත් කිරීම වැළැක්වීම සඳහා සේවාදායකය තුළ ඇති අගයන් ස්වයංක්රීයව ගැලවී යාම සමහර විට ආරක්ෂක අංගයක් ලෙස සැලකේ. ආදාන අගයන් නිවැරදිව ගැලවී ගියහොත්, සූදානම් නොකළ ප්රකාශවලින් එකම මට්ටමේ ආරක්ෂාවක් ලබා ගත හැකිය
එබැවින්, intval()
ඕනෑම විමසුමක් යැවීමට පෙර පූර්ණ සංඛ්යා සඳහා දත්ත වලංගු කිරීම හොඳ අදහසක් බව මෙයින් සනාථ වේ. ඊට අමතරව, විමසුම යැවීමට පෙර අනිෂ්ට පරිශීලක දත්ත වලක්වා ගැනීම නිවැරදි හා වලංගු ප්රවේශයකි .
කරුණාකර වැඩි විස්තර සඳහා මෙම ප්රශ්නය බලන්න: පීඩීඕ විසින් අමු විමසුම MySQL වෙත යවන අතර මිස්ක්ලි සූදානම් කළ විමසුම යවයි, දෙකම එකම ප්රති result ලය ලබා දෙයි
යොමුව:
- SQL එන්නත් වංචා පත්රය
- SQL එන්නත් කිරීම
- තොරතුරු ආරක්ෂාව
- ආරක්ෂක මූලධර්ම
- දත්ත වලංගුකරණය