“බොබී මේස” XKCD විකට චිත්‍රපටයෙන් SQL එන්නත් කරන්නේ කෙසේද?


1103

දෙස බලමින්:

XKCD තීරුව (මුලාශ්‍රය: https://xkcd.com/327/ )

මෙම SQL කරන්නේ කුමක්ද:

Robert'); DROP TABLE STUDENTS; --

මම යන දෙකම දැන 'සහ --අදහස් ලබා ගැනීම සඳහා වන අතර, නමුත් වචනය වන්නේ DROPඑය එකම මාර්ගය කොටසක් වන බැවින්, මෙන්ම අදහස් ලබා?


16
ඔබ Stack Overflow Podcast # 31 (2008 නොවැම්බර් 27) ට ඇහුම්කන් දෙන්නේ නම් , ඔවුන් ඇත්ත වශයෙන්ම මේ ගැන සාකච්ඡා කරයි.
EBGreen

93
MySQL හි, අදහස්' සඳහා නොවේ . එය තිබුනත්, එයට පෙර ඉඩක් නොමැති බැවින් එයට අවසන් කළ හැක්කේ ඊට පෙර ඇති නූල පමණි.
කක්ෂයේ සැහැල්ලු ධාවන තරඟ

45
XKCD යන තාක් දුරට, සමහර කොමික් පිළිබඳ කිසියම් ප්‍රශ්නයක් ඇත්නම් ඔබට සෑම විටම XKCD පැහැදිලි කිරීම වෙත ගොස් ඔබේ පිළිතුර සොයාගත හැකිය. එක්ස්කේසීඩී විකියක් පවා ඇත , එය එක්ස්කේසීඩී භූහාෂිං
ඇනටෝලි

13
මෙම සබැඳිය මෙහි පටිගත කළ යුතු යැයි මම විශ්වාස කරමි: bobby-tables.com
'

2
beta.companieshouse.gov.uk/company/10542519 යනු උපදේශනය සඳහා නම් කිරීමකි; DROP TABLE "COMPANIES"; - LTD
Alex Dupuy

Answers:


1122

එය සිසුන්ගේ මේසයට වැටේ.

පාසලේ වැඩසටහනේ මුල් කේතය බොහෝ විට සමාන ය

q = "INSERT INTO Students VALUES ('" + FNMName.Text + "', '" + LName.Text + "')";

විමසුමකට පෙළ ආදානය එක් කිරීමට මෙය බොළඳ ක්‍රමය වන අතර එය ඔබට පෙනෙන පරිදි ඉතා නරක ය .

පළමු නමෙන් අගයන්, මැද නම පෙළ කොටුව FNMName.Text (එනම් Robert'); DROP TABLE STUDENTS; --) සහ අවසාන නම පෙළ කොටුව LName.Text (අපි එය හඳුන්වමු Derper) ඉතිරි විමසුමට සමගාමීව, ප්‍රති result ලය දැන් ඇත්ත වශයෙන්ම විමසුම් දෙකකින් වෙන් කර ඇත ප්‍රකාශන පර්යන්තය (අර්ධ සළකුණ). දෙවන විමසුම පළමුවැන්නාට එන්නත් කර ඇත. කේතය දත්ත සමුදායට එරෙහිව මෙම විමසුම ක්‍රියාත්මක කරන විට, එය මේ ආකාරයෙන් පෙනෙනු ඇත

INSERT INTO Students VALUES ('Robert'); DROP TABLE Students; --', 'Derper')

එය සරල ඉංග්‍රීසියෙන් දළ වශයෙන් විමසුම් දෙකට පරිවර්තනය කරයි:

'රොබට්' හි නම වටිනාකම සහිත නව වාර්තාවක් ශිෂ්‍ය වගුවට එක් කරන්න

සහ

ශිෂ්‍ය වගුව මකන්න

දෙවන විමසුම පසු කළ සියල්ල අදහස් දැක්වීමක් ලෙස සලකුණු කර ඇත : --', 'Derper')

මෙම 'ශිෂ්ය නාමයෙන් එය අවසන් වේ, අදහස් නොවේ string පරිසීමකය . ශිෂ්‍යයාගේ නම නූලක් බැවින්, උපකල්පිත විමසුම සම්පූර්ණ කිරීම සඳහා එය කෘතිමව අවශ්‍ය වේ. ඉන්ජෙක්ෂන් ප්‍රහාර ක්‍රියාත්මක වන්නේ ඔවුන් විමසන වලංගු SQL විමසුමකදී පමණි .

Dan04 හි විශ්මයජනක අදහස් දැක්වීමට අනුව නැවත සංස්කරණය කරන ලදි


3
ම්ම්ම්, තර්ක වටා වරහන් සහිත WHERE තරමක් අසාමාන්‍ය ය, නමුත් අවම වශයෙන් එය සින්ටැක්ස් දෝෂයක් මඟහරවා ගනී ... :-)
ෆිල්හෝ

60
HiPhiLho: මුල් ප්‍රකාශය INSERTනම්, වරහන් වඩාත් අර්ථවත් වනු ඇත. දත්ත සමුදා සම්බන්ධතාවය කියවීමට පමණක් නොවන ආකාරයෙන් එය පැහැදිලි කරයි.
dan04

3
@ Dan04 පැහැදිලි කරන පරිදි, වරහන් යනු a සමඟ වඩාත් අර්ථවත් කරයි INSERT. පසුපසට සිතන SELECTවිට, මේසයේ ඇති කුඩා බොබී වගු ඇතුළු කිරීම දැනටමත් මේසය අතහැර දමා ඇති බැවින් එය කෙසේ හෝ ක්‍රියාත්මක නොවනු ඇත.
ypercubeᵀᴹ

10
ඇත්ත වශයෙන්ම, මෙම උදාහරණයේ පළමු විමසුම ("නව වාර්තාවක් එක් කරන්න ...") අසාර්ථක Studentsවනුයේ එක් තීරුවකට වඩා වැඩි ප්‍රමාණයක් අපේක්ෂා කරන බැවිනි (මුල් / නිවැරදි ප්‍රකාශය තීරු දෙකක් ලබා දී ඇත). දෙවන තීරුවේ පැමිණීම අදහස් දැක්වීම අවශ්‍ය වන්නේ මන්දැයි පෙන්වීමට උපකාරී වේ; කෙනෙකුට බොබීගේ නම වෙනස් කළ නොහැකි බැවින්, මෙම නිරීක්‍ෂණයට පාදසටහනක් ලෙස මඳක් වැඩි යමක් තිබීම සුදුසුය.
ఎగ్යාල්

7
එක්ස්බීසීඩී පැහැදිලි කිරීමකට අනුව බොබීගේ අවසාන නම - හෝ අවම වශයෙන් ඔහුගේ මවගේ නම රොබට්ස් ය . එය නිවැරදි කිරීමෙන් පිළිතුරු පැහැදිලි බව වැඩි දියුණු වනු ඇතැයි මට විශ්වාස නැත.
WBT

613

නම විචල්‍යයක භාවිතා කළ බව කියමු $Name.

ඔබ පසුව මෙම විමසුම ක්‍රියාත්මක කරයි :

INSERT INTO Students VALUES ( '$Name' )

කේතය වැරදීමකින් පරිශීලකයා විසින් සපයන ලද ඕනෑම දෙයක් විචල්‍යය ලෙස ස්ථානගත කරයි.

ඔබට SQL අවශ්‍ය වූයේ :

සිසුන්ගේ වටිනාකම් ඇතුළත් කරන්න (' Robert Tables`)

නමුත් දක්ෂ පරිශීලකයෙකුට අවශ්‍ය ඕනෑම දෙයක් සැපයිය හැකිය:

සිසුන්ගේ වටිනාකම් ඇතුළත් කරන්න (' Robert'); DROP TABLE Students; --')

ඔබට ලැබෙන්නේ:

INSERT INTO Students VALUES ( 'Robert' );  DROP TABLE STUDENTS; --' )

මෙම --පමණක් මාර්ගයේ ඉතිරි අදහස්.


88
වැඩිම ඡන්දය පාවිච්චි කිරීමෙන් පසුව මෙය වඩා හොඳය, මන්ද එය අවසාන වරහන් පැහැදිලි කරයි.
ටිම් බෙත්

1
මාර්ගය වන විට, කොමික්ස් හි පාසල් අධ්‍යක්ෂවරයාට දැන ගැනීමට හෝ XSS ශිෂ්‍ය වගුව මකා දැමූ බැවින් දැන ගැනීමට ක්‍රමයක් නොමැත, මෙය සිදු කළේ කවුරුන්දැයි ඔහුට දැනගත නොහැක.
xryl669

ry xryl669 මෙවැනි අවස්ථාවලදී ලොග් ඉතා ප්‍රයෝජනවත් වේ ... සමහර විට සියලුම විමසුම් ලොග් වී ඇති අතර සමහර විට වෙනත් ලොග් වූ තොරතුරු මඟින් වැරදිකරු අඩු කර ගැනීමට ඔබට හැකි වේ.
inemanja

165

අනෙක් සියල්ලන්ම දැනටමත් පෙන්වා දී ඇති පරිදි, ');මුල් ප්‍රකාශය වසා දමා දෙවන ප්‍රකාශයක් පහත දැක්වේ. PHP වැනි භාෂා ඇතුළුව බොහෝ රාමු වල පෙරනිමි ආරක්ෂක සැකසුම් ඇති අතර ඒවා එක් SQL නූලක බහු ප්‍රකාශයන්ට ඉඩ නොදේ. නිදසුනක් ලෙස, PHP හි, ඔබට mysqli_multi_queryශ්‍රිතය භාවිතා කිරීමෙන් එක් SQL නූලකින් පමණක් ප්‍රකාශ කිහිපයක් ක්‍රියාත්මක කළ හැකිය .

කෙසේ වෙතත්, ඔබට දෙවන ප්‍රකාශයක් එකතු නොකර SQL එන්නත් කිරීම හරහා පවතින SQL ප්‍රකාශයක් හැසිරවිය හැකිය. මෙම සරල තේරීම සමඟ පරිශීලක නාමයක් සහ මුරපදයක් පරික්ෂා කරන පිවිසුම් පද්ධතියක් ඔබ සතුව ඇතැයි කියමු:

$query="SELECT * FROM users WHERE username='" . $_REQUEST['user'] . "' and (password='".$_REQUEST['pass']."')";
$result=mysql_query($query);

ඔබ peterපරිශීලක නාමය secretලෙස සහ මුරපදය ලෙස සපයන්නේ නම් , එහි ප්‍රති ing ලයක් ලෙස ඇති SQL දණ්ඩ මේ ආකාරයෙන් පෙනේ:

SELECT * FROM users WHERE username='peter' and (password='secret')

හැම දෙයක්ම හොඳයි. මුරපදය ලෙස ඔබ මෙම නූල සපයන බව සිතන්න:

' OR '1'='1

එවිට ලැබෙන SQL රේඛාව මෙය වනු ඇත:

SELECT * FROM users WHERE username='peter' and (password='' OR '1'='1')

මුරපදය නොදැන ඕනෑම ගිණුමකට පිවිසීමට එය ඔබට ඉඩ සලසයි. එබැවින් ඔබට SQL එන්නත් කිරීම සඳහා ප්‍රකාශ දෙකක් භාවිතා කිරීමට අවශ්‍ය නොවිය යුතුය, නමුත් ඔබට විවිධ ප්‍රකාශ සැපයීමට හැකි නම් වඩාත් විනාශකාරී දේවල් කළ හැකිය.


71

නැත, 'SQL හි අදහස් දැක්වීමක් නොව පරිසීමකය.

අම්මා සිතුවේ දත්ත සමුදා ක්‍රමලේඛකයා ඉල්ලීමක් කළේ මෙසේ ය:

INSERT INTO 'students' ('first_name', 'last_name') VALUES ('$firstName', '$lastName');

(නිදසුනක් ලෙස) $xxxආකෘතිය පරීක්ෂා නොකර හෝ විශේෂ අක්ෂර වලින් ගැලවී නොයා, විචල්‍ය අන්තර්ගතයන් HTML ආකෘතියකින් කෙලින්ම පිටතට ගත් නව ශිෂ්‍යයා එකතු කිරීම .

එබැවින් දත්ත සමුදා වැඩසටහන $firstNameඅඩංගු නම් Robert'); DROP TABLE students; --පහත ඉල්ලීම කෙලින්ම ඩී.බී. මත ක්‍රියාත්මක කරයි:

INSERT INTO 'students' ('first_name', 'last_name') VALUES ('Robert'); DROP TABLE students; --', 'XKCD');

එනම්. එය ඇතුළත් කිරීමේ ප්‍රකාශය කලින් අවසන් කර, රති er ් want ාට අවශ්‍ය ඕනෑම අනිෂ්ට කේතයක් ක්‍රියාත්මක කර, ඉතිරි කේතයේ ඕනෑම දෙයක් අදහස් දක්වන්න.

ම්ම්ම්, මම ඉතා මන්දගාමී ය, තැඹිලි පටිය තුළ මට පෙර පිළිතුරු 8 ක් දැනටමත් පෙනේ ... :-) ජනප්‍රිය මාතෘකාවක්, එය පෙනේ.


39

ටීඑල්; ඩී.ආර්

- ඉල්ලුම් පත්රය ආදාන, මේ අවස්ථාවේ දී, උත්සාහ තොරව පිළිගන්නා 'නැන්සි' 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 කේත ක්‍රියාත්මක කිරීමට හේතු නොවේ. SqlParameterADO.NET හි භාවිතා කිරීම වැනි පරාමිතිගත විමසුම් ඔබ භාවිතා කරන්නේ නම්, SQL එන්නත් කිරීමෙන් ආරක්ෂා වීම සඳහා ආදානය අවම වශයෙන් ස්වයංක්‍රීයව සනීපාරක්ෂාව වනු ඇත.

කෙසේ වෙතත්, යෙදුම් මට්ටමින් යෙදවුම් සනීපාරක්ෂාව කිරීමෙන් වඩාත් දියුණු SQL එන්නත් කිරීමේ ක්‍රම නතර නොවනු ඇත. උදාහරණයක් ලෙස, PHP ක්‍රියාකාරිත්වය මග හැරීමට ක්‍රම තිබේmysql_real_escape_string . අමතර ආරක්ෂාව සඳහා, බොහෝ දත්ත සමුදා පද්ධති සකස් කළ ප්‍රකාශයන්ට සහාය දක්වයි . බැකෙන්ඩයේ නිසියාකාරව ක්‍රියාත්මක කරන්නේ නම්, සකස් කළ ප්‍රකාශ මඟින් දත්ත ආදානයන් සෙසු විධානයන්ගෙන් අර්ථාන්විතව වෙන් කොට සැලකීමෙන් SQL එන්නත් කිරීම කළ නොහැකි ය.


30

ඔබ මේ වගේ ශිෂ්‍ය නිර්මාණ ක්‍රමයක් බොළඳ ලෙස ලියා ඇති බව පවසන්න:

void createStudent(String name) {
    database.execute("INSERT INTO students (name) VALUES ('" + name + "')");
}

යමෙක් නමට ඇතුල් වේ Robert'); DROP TABLE STUDENTS; --

දත්ත සමුදාය ක්‍රියාත්මක වන්නේ කුමක් ද යන්න මෙම විමසුමයි:

INSERT INTO students (name) VALUES ('Robert'); DROP TABLE STUDENTS --')

අර්ධ සළකුණ ඇතුළු කිරීමේ විධානය අවසන් කර තවත් එකක් ආරම්භ කරයි; - පේළියේ ඉතිරි කොටස අදහස් දක්වයි. DROP TABLE විධානය ක්‍රියාත්මක වේ ...

බන්ධන පරාමිතීන් හොඳ දෙයක් වන්නේ මේ නිසා ය.


26

තනි උපුටා දැක්වීමක් යනු නූලක ආරම්භය හා අවසානයයි. අර්ධ සළකුණ යනු ප්‍රකාශයක අවසානයයි. ඉතින් ඔවුන් මේ වගේ තේරීමක් කරන්නේ නම්:

Select *
From Students
Where (Name = '<NameGetsInsertedHere>')

SQL බවට පත්වන්නේ:

Select *
From Students
Where (Name = 'Robert'); DROP TABLE STUDENTS; --')
--             ^-------------------------------^

සමහර පද්ධති වල, ප්‍රකාශයෙන් selectපළමුව ධාවනය වනු ඇත drop! පණිවිඩය: ඔබේ SQL තුළට එම්බෙඩ් අගයන් ලබා නොදෙන්න. ඒ වෙනුවට පරාමිතීන් භාවිතා කරන්න!


18

මෙම ');විමසුම අවසන්, එය අදහස් ආරම්භ කරන්නේ නැත. ඉන්පසු එය සිසුන්ගේ මේසය අතහැර දමා ක්‍රියාත්මක කළ යුතු ඉතිරි විමසුමට අදහස් දක්වයි.


17

දත්ත සමුදායේ ලේඛකයා බොහෝ විට කළේ a

sql = "SELECT * FROM STUDENTS WHERE (STUDENT_NAME = '" + student_name + "') AND other stuff";
execute(sql);

ශිෂ්‍ය නාමය ලබා දී ඇත්තේ නම්, එය තේරීම "රොබට්" යන නම සමඟ කර මේසය පහත දමයි. "-" කොටස දී ඇති විමසුමේ ඉතිරි කොටස අදහස් දැක්වීමක් ලෙස වෙනස් කරයි.


එය මගේ පළමු සිතුවිල්ල විය, නමුත් ඔබට පසුපස වරහන වර්‍ග සමඟ සින්ටැක්ස් දෝෂයක් ඇති වේ, නැත?
ෆිල්හෝ

3
ඒ නිසා - අවසානයේ දී, ඉතිරි පා text ය අදහස් දැක්වීමක් වන අතර එය නොසලකා හැරිය යුතුය.

17

මෙම අවස්ථාවේ දී, 'අදහස් දැක්වීමේ චරිතයක් නොවේ. එය නූල් වචනාර්ථ සීමා කිරීමට භාවිතා කරයි. විකට චිත්‍ර ශිල්පියා බැංකුකරණය කරන්නේ ප්‍රශ්නයට ලක්වූ පාසල තුළ ගතික වර්ගීකරණයක් කොතැනක හෝ ඇති බව පෙනේ.

$sql = "INSERT INTO `Students` (FirstName, LastName) VALUES ('" . $fname . "', '" . $lname . "')";

ඉතින් දැන් 'චරිතය ක්‍රමලේඛකයා අපේක්ෂා කිරීමට පෙර වචනාර්ථයෙන් අවසන් වේ. සමඟ ඒකාබද්ධව; ප්‍රකාශය අවසන් කිරීමට චරිතය, ප්‍රහාරකයෙකුට දැන් ඔවුන්ට අවශ්‍ය ඕනෑම වර්ගයක් එකතු කළ හැකිය. අවසානයේ අදහස් දැක්වීම යනු මුල් ප්‍රකාශයේ ඉතිරිව ඇති වර්ග අඩි ප්‍රමාණය විමසුම සේවාදායකය මත සම්පාදනය කිරීමෙන් වලක්වනු නොලබන බවට වග බලා ගැනීමයි.

FWIW, මම සිතන්නේ ප්‍රශ්නයට ලක්වූ විකට වැදගත් විස්තරයක් වැරදියි: ඔබ සිතන්නේ ඔබේ දත්ත සමුදා යෙදවුම් සනීපාරක්ෂාව කිරීම ගැන නම් , විකට යෝජනා කරන පරිදි, ඔබ තවමත් එය වැරදියි. ඒ වෙනුවට, ඔබේ දත්ත සමුදා යෙදවුම් නිරෝධායනය කිරීම සම්බන්ධයෙන් ඔබ සිතිය යුතු අතර , මෙය කිරීමට නිවැරදි ක්‍රමය වන්නේ පරාමිතිගත විමසුම් හරහා ය.


16

'SQL හි අක්ෂර අක්ෂර නියත සඳහා භාවිතා වේ. මෙම අවස්ථාවේ දී එය නියත නියතය අවසන් කිරීම සඳහා භාවිතා කරන අතර අදහස් දැක්වීම සඳහා නොවේ.


7

එය ක්‍රියාත්මක වන ආකාරය මෙයයි: පරිපාලකයා ශිෂ්‍යයාගේ වාර්තා සොයයි යැයි සිතමු

Robert'); DROP TABLE STUDENTS; --

පරිපාලක ගිණුමට ඉහළ වරප්‍රසාද ඇති බැවින් මෙම ගිණුමෙන් වගුව මකා දැමිය හැකිය.

ඉල්ලීමෙන් පරිශීලක නාමය ලබා ගැනීමේ කේතය වේ

දැන් විමසුම මේ වගේ දෙයක් වනු ඇත (ශිෂ්‍ය වගුව සෙවීමට)

String query="Select * from student where username='"+student_name+"'";

statement.executeQuery(query); //Rest of the code follows

එහි ප්‍රති qu ලය විමසුම බවට පත්වේ

Select * from student where username='Robert'); DROP TABLE STUDENTS; --

පරිශීලක ආදානය සනීපාරක්ෂක නොවන බැවින්, ඉහත විමසුම කොටස් 2 කට හසුරුවනු ලැබේ

Select * from student where username='Robert'); 

DROP TABLE STUDENTS; --

ද්විත්ව ඉර (()) මඟින් විමසුමේ ඉතිරි කොටස පමණක් අදහස් දක්වනු ඇත.

මුරපද සත්‍යාපනය අවලංගු කළ හැකි බැවින් මෙය භයානක ය

පළමුවැන්නා සාමාන්‍ය සෙවීම සිදු කරයි.

ගිණුමට ප්‍රමාණවත් වරප්‍රසාද තිබේ නම් දෙවැන්න ශිෂ්‍යයා අතහැර දමනු ඇත (සාමාන්‍යයෙන් පාසල් පරිපාලක ගිණුම එවැනි විමසුමක් ක්‍රියාත්මක කරනු ඇති අතර ඉහත සඳහන් කළ වරප්‍රසාද ලැබෙනු ඇත).


SELECT* FROM sutdents ...- ඔබට "s" එකක් අමතක විය. ඔබ අතහරින්නේ මෙයයි. DROP TABLE STUDENTS;
DevWL

4

SQL එන්නත් කිරීම සඳහා ඔබට ආකෘති දත්ත ඇතුළත් කිරීමට අවශ්‍ය නොවේ.

මීට පෙර කිසිවෙකු මෙය පෙන්වා නොදුන් නිසා මම ඔබගෙන් සමහරෙකුට අනතුරු ඇඟවිය හැකිය.

බොහෝ විට අපි ආකෘති ආදානය ඇලවීමට උත්සාහ කරමු. නමුත් ඔබට SQL එන්නත් කිරීම මගින් පහර දිය හැකි එකම ස්ථානය මෙය නොවේ. GET ඉල්ලීම හරහා දත්ත යවන URL සමඟ ඔබට ඉතා සරල ප්‍රහාරයක් කළ හැකිය; පුරන් වූ උදාහරණය සලකා බලන්න:

<a href="/show?id=1">show something</a>

ඔබේ url එක http://yoursite.com/show?id=1 ලෙස පෙනෙනු ඇත

දැන් යමෙකුට මේ වගේ දෙයක් උත්සාහ කළ හැකිය

http://yoursite.com/show?id=1;TRUNCATE table_name

Table_name සැබෑ වගු නාමය සමඟ ප්‍රතිස්ථාපනය කිරීමට උත්සාහ කරන්න. ඔහු ඔබේ මේසයේ නම නිවැරදිව ලබා ගන්නේ නම් ඔවුන් ඔබේ මේසය හිස් කරනු ඇත! (සරල අක්ෂර වින්‍යාසය සමඟ මෙම URL එක බලහත්කාරයෙන් බල කිරීම ඉතා පහසුය)

ඔබේ විමසුම මේ වගේ දෙයක් වනු ඇත ...

"SELECT * FROM page WHERE id = 4;TRUNCATE page"

PDO භාවිතා කරමින් PHP අවදානමට ලක්විය හැකි කේතයේ උදාහරණය:

<?php
...
$id = $_GET['id'];

$pdo = new PDO($database_dsn, $database_user, $database_pass);
$query = "SELECT * FROM page WHERE id = {$id}";
$stmt = $pdo->query($query);
$data = $stmt->fetch(); 
/************* You have lost your data!!! :( *************/
...

විසඳුම - PDO සකස් කිරීම () සහ bindParam () ක්‍රම භාවිතා කරන්න:

<?php
...
$id = $_GET['id'];

$query = 'SELECT * FROM page WHERE id = :idVal';
$stmt = $pdo->prepare($query);
$stmt->bindParam('idVal', $id, PDO::PARAM_INT);
$stmt->execute();
$data = $stmt->fetch();
/************* Your data is safe! :) *************/
...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.