ටීඑල්; ඩී.ආර්
- ඉල්ලුම් පත්රය ආදාන, මේ අවස්ථාවේ දී, උත්සාහ තොරව පිළිගන්නා 'නැන්සි' sanitize ආදාන, එවැනි විශේෂ අක්ෂර පලා එන මෙන් -
පාසල් => INSERT ඇතුල් සිසුන් වටිනාකම් ( 'නැන්සි' ;) ඇතුල් කරන්න 0 1
- දත්ත සමුදා විධානය ආදාන හසුරුවා විට SQL එන්නත් සිදුවන - අත්තනෝමතික SQL ක්රියාත්මක කිරීමට දත්ත සමුදා සේවාදායකය හේතුව
පාසල් => INSERT ඇතුල් සිසුන් වටිනාකම් ( 'රොබට්' ); Drop වගුව සිසුන් ; - '); ඇතුළු කරන්න 0 1 Drop වගුව
- ශිෂ්ය වාර්තා දැන් නැති වී ඇත - එය ඊටත් වඩා නරක වන්නට ඇත!
පාසල් => SELECT * සිට සිසුන් ;
දෝෂය : සම්බන්ධයෙන් "සිසුන්" නැහැ නැහැ පවතී
LINE 1 : සිෙලක්ට් * සිට සිසුන් ; ^
මෙය ශිෂ්ය වගුව පහත වැටේ (මකා දමයි).
( මෙම පිළිතුරේ ඇති සියලුම කේත උදාහරණ PostgreSQL 9.1.2 දත්ත සමුදා සේවාදායකයක් මත ක්රියාත්මක විය. )
සිදුවන්නේ කුමක්ද යන්න පැහැදිලි කිරීම සඳහා, නාම ක්ෂේත්රය පමණක් අඩංගු සරල වගුවකින් මෙය උත්සාහ කර තනි පේළියක් එක් කරමු:
පාසල් => නිර්මාණය වගුව සිසුන් ( නම විශාලිත ප්රාථමික යතුර );
දැනුම්දීම : නිර්මාණය වගුව / ප්රාථමික යතුර ඇත නිර්මාණය ගම්ය මිල දර්ශකය "students_pkey" සඳහා මේසය "සිසුන්" නිර්මාණය වගුව
පාසල් => INSERT ඇතුල් සිසුන් වටිනාකම් ( ජෝන් ' ); ඇතුල් කරන්න 0 1
වගුවට දත්ත ඇතුල් කිරීමට යෙදුම පහත SQL භාවිතා කරයි යැයි සිතමු:
INSERT ඇතුල් සිසුන් වටිනාකම් ( 'ෆූබාර්' );
foobar
ශිෂ්යයාගේ සැබෑ නම සමඟ ප්රතිස්ථාපනය කරන්න . සාමාන්ය ඇතුළත් කිරීමේ මෙහෙයුමක් මේ වගේ වනු ඇත:
- ආදාන: නැන්සි
පාසල් => INSERT ඇතුල් සිසුන් වටිනාකම් ( 'නැන්සි' ); ඇතුල් කරන්න 0 1
අපි මේසය විමසන විට, අපට මෙය ලැබේ:
පාසල් => SELECT * සිට සිසුන් ;
නාමය
-------
ජෝන්
නැන්සි
( පේළි 2 )
අපි ලිට්ල් බොබී ටේබල්ස්ගේ නම මේසය තුළට ඇතුළු කළ විට කුමක් සිදුවේද?
- ආදානය: රොබට් '); ටේබල් සිසුන් අතහරින්න; -
පාසල් => INSERT ඇතුල් සිසුන් වටිනාකම් ( 'රොබට්' ); Drop වගුව සිසුන් ; - '); ඇතුළු කරන්න 0 1 Drop වගුව
මෙහි ඇති SQL එන්නත ශිෂ්යයාගේ නම ප්රකාශය අවසන් කර වෙනම DROP TABLE
විධානයක් ඇතුළත් කිරීමේ ප්රති result ලයකි; ආදානයේ අවසානයේ ඇති ඉරක් දෙක වෙනත් ආකාරයකින් දෝෂයක් ඇතිවිය හැකි ඉතිරිව ඇති කේතයක් අදහස් දැක්වීමට අදහස් කරයි. ප්රතිදානයේ අවසාන පේළිය දත්ත සමුදා සේවාදායකය මේසය අතහැර දමා ඇති බව සනාථ කරයි.
INSERT
මෙහෙයුම අතරතුර යෙදුම කිසිදු විශේෂ අක්ෂර සඳහා ආදානය පරික්ෂා නොකරන බව සැලකිල්ලට ගැනීම වැදගත්ය , එබැවින් අත්තනෝමතික ආදානය SQL විධානයට ඇතුළත් කිරීමට ඉඩ දෙයි. මෙයින් අදහස් කරන්නේ අනිෂ්ට පරිශීලකයෙකුට සාමාන්යයෙන් පරිශීලක ආදානය සඳහා අදහස් කරන ක්ෂේත්රයකට, උපුටා දැක්වීම් වැනි විශේෂ සංකේත සහ අත්තනෝමතික SQL කේතය දත්ත සමුදා පද්ධතිය ක්රියාත්මක කිරීමට හේතු වන පරිදි ඇතුළත් කළ හැකි බවයි, එබැවින් SQL එන්නත් කිරීම .
ප්රතිඵලය?
පාසල් => SELECT * සිට සිසුන් ;
දෝෂය : සම්බන්ධයෙන් "සිසුන්" නැහැ නැහැ පවතී
LINE 1 : සිෙලක්ට් * සිට සිසුන් ; ^
SQL එන්නත් කිරීම යනු මෙහෙයුම් පද්ධතියක හෝ යෙදුමක දුරස්ථ අත්තනෝමතික කේත ක්රියාත්මක කිරීමේ අවදානමට සමාන දත්ත සමුදායකි . සාර්ථක SQL එන්නත් කිරීමේ ප්රහාරයක විභව බලපෑම අවතක්සේරු කළ නොහැකිය - දත්ත සමුදා පද්ධතිය සහ යෙදුම් වින්යාසය මත පදනම්ව, එය දත්ත නැතිවීමට (මෙම අවස්ථාවේ දී මෙන්), දත්ත වලට අනවසරයෙන් ප්රවේශ වීමට හෝ ක්රියාත්මක කිරීමට පවා ප්රහාරකයෙකුට භාවිතා කළ හැකිය. ධාරක යන්ත්රයේම අත්තනෝමතික කේතය.
XKCD කොමික් විසින් සටහන් කර ඇති පරිදි, SQL එන්නත් කිරීමේ ප්රහාර වලින් ආරක්ෂා වීමට එක් ක්රමයක් වන්නේ විශේෂ අක්ෂර වලින් ගැලවීම වැනි දත්ත සමුදා යෙදවුම් සනීපාරක්ෂාව කිරීමයි, එවිට ඔවුන්ට යටින් පවතින SQL විධානය වෙනස් කිරීමට නොහැකි වන අතර අත්තනෝමතික SQL කේත ක්රියාත්මක කිරීමට හේතු නොවේ. SqlParameter
ADO.NET හි භාවිතා කිරීම වැනි පරාමිතිගත විමසුම් ඔබ භාවිතා කරන්නේ නම්, SQL එන්නත් කිරීමෙන් ආරක්ෂා වීම සඳහා ආදානය අවම වශයෙන් ස්වයංක්රීයව සනීපාරක්ෂාව වනු ඇත.
කෙසේ වෙතත්, යෙදුම් මට්ටමින් යෙදවුම් සනීපාරක්ෂාව කිරීමෙන් වඩාත් දියුණු SQL එන්නත් කිරීමේ ක්රම නතර නොවනු ඇත. උදාහරණයක් ලෙස, PHP ක්රියාකාරිත්වය මග හැරීමට ක්රම තිබේmysql_real_escape_string
. අමතර ආරක්ෂාව සඳහා, බොහෝ දත්ත සමුදා පද්ධති සකස් කළ ප්රකාශයන්ට සහාය දක්වයි . බැකෙන්ඩයේ නිසියාකාරව ක්රියාත්මක කරන්නේ නම්, සකස් කළ ප්රකාශ මඟින් දත්ත ආදානයන් සෙසු විධානයන්ගෙන් අර්ථාන්විතව වෙන් කොට සැලකීමෙන් SQL එන්නත් කිරීම කළ නොහැකි ය.