குயின்

குயின் நிரல் அல்லது குயின் என்பது செயல்படுத்தப்படும் போது அதன் சொந்த மூலக் குறியீட்டை வெளியிடும் ஒரு நிரலாகும். ஒரு குயின், எடுத்துக்காட்டாக, அதைக் கொண்ட கோப்பின் உள்ளடக்கங்களை அச்சிடுவதன் மூலம் அல்லது அதன் சொந்த பிரதிநிதித்துவத்தை அச்சிட உள்நோக்க திறன்களைப் பயன்படுத்துவதன் மூலம் "தன்னைத் தானாக அடியெடுத்து வைக்கக்கூடாது". மாறாக, அதன் சொந்த மூலக் குறியீட்டைக் கணக்கிட வேண்டும்.


அத்தகைய திட்டத்தை உருவாக்குவதற்கான உன்னதமான வழி இரண்டு படிகளில் நடைபெறுகிறது:

  1. இடைக்கணிப்புக்கான ஒரு ப்ளாஸ்ஹோல்டருடன் ஒரு சரம் மாறியை துவக்கவும்.
  2. சரத்தை அச்சிட்டு அதனுள் இடைக்கணிக்கவும்.

சரத்தை சரியாகப் பெறுவதே தந்திரம். இதை எப்படி செய்வது என்பது மொழிக்கு மொழி மாறுபடும் மற்றும் மாறி எவ்வாறு அறிவிக்கப்படுகிறது, அரைப்புள்ளிகள் மற்றும் புதிய வரிகளின் தேவை, மேற்கோள் குறிகள் போன்றவற்றைப் பொறுத்தது. மேற்கோள் குறிகளின் பயன்பாடு சுவாரஸ்யமானது; மேற்கோள் குறியை உண்மையில் பயன்படுத்தாமல் மேற்கோள் குறி அச்சிடப்பட வேண்டும் என்பதைக் குறிக்க ஒரு வழியைக் கண்டுபிடிக்க வேண்டும்.

பேஷ்

பாஷில் உள்ள பெரும்பாலான விஷயங்களைப் போலவே, இந்த நிரலும் ஒரு சுவாரஸ்யமான விந்தையைப் பயன்படுத்துகிறது. ஒற்றை மேற்கோள்கள் வலுவான மேற்கோள்கள் மற்றும் எதையும் விரிவுபடுத்தவில்லை என்றாலும், விளக்கப்பட்டது printf octal தப்பிக்கும் எழுத்துகள் குறிப்பிடப்பட்ட குறியீடு புள்ளியுடன் எழுத்துகளாக:

s='s=%s;printf "$s" "$s"';printf "$s" "$s"

மலைப்பாம்பு

பைத்தானில், வடிவக் குறிப்பான் திரும்பும் %r தானாக ஒற்றை மேற்கோள்கள். குறியீடு ஒரு புதிய வரி எழுத்துடன் முடிவடைந்தால் அது எளிதானது:

s='s=%r;print(s%%s)';print(s%s)

வரி முறிவுகள் இல்லாத குறியீடு வேண்டுமானால், பின்வருவனவற்றை எழுத வேண்டும்:

s='s=%r;print(s%%s,sep="")';print(s%s,sep="")

ஜாவாஸ்கிரிப்ட்

பின்வரும் ஜாவாஸ்கிரிப்ட் குயின்கள் node.js இன் கீழ் இயங்குகின்றன. நீங்கள் பயன்படுத்துகிறீர்கள் console.log, இது எப்போதும் ஒரு புதிய வரியைச் சேர்க்கும், எனவே ஒவ்வொரு ஸ்கிரிப்ட்டின் முடிவிலும் ஒரு புதிய வரி தேவைப்படுகிறது:

s="s=%j;console.log(s,s)";console.log(s,s)

பின்வரும் நிரலும் சுவாரஸ்யமானது: இது அதன் முழுப் பிரதிநிதித்துவத்தையும் அச்சிடாது, ஆனால் செயல்பாடுகளுக்கு ஒரு குறிப்பிட்ட பிரதிநிதித்துவம் உள்ளது என்ற உண்மையை அது சார்ந்துள்ளது.:

(function a(){console.log('('+a+')()')})()

அடுத்த உதாரணம் மோசடிக்கு அருகில் உள்ளது, ஏனெனில் அது eval பயன்படுத்தப்பட்டது:

code='var q=unescape("%27");console.log("code="+q+code+q+";eval(code)")';eval(code)

துரு

ரஸ்ட் அதன் வடிவமைக்கப்பட்ட அச்சு மேக்ரோவில் மேற்கோள்களில் ஒரு வாதத்தை இணைக்க ஒரு வழியை வழங்குகிறது. இருப்பினும், இந்த மேக்ரோவிற்கு அச்சு மேக்ரோவின் முதல் வாதம் ஒரு ஸ்ட்ரிங் லிட்டராக இருக்க வேண்டும்! எனவே நிலை வாத அடையாளங்காட்டியைப் பயன்படுத்துவது சிறந்தது:

fn main(){print!("fn main(){{print!({0:?},{0:?})}}","fn main(){{print!({0:?},{0:?})}}")}

PHP

இந்த PHP நிரல் மூலக் குறியீட்டை ஒரு சரத்தில் சேமித்து பின்னர் அந்த சரத்தைப் பயன்படுத்தி செயல்படுகிறது printf வெளியீடுகள். தி 39 ASCII தன்மையைக் குறிக்கிறது ', சரத்தில் உள்ள மேற்கோள்களை சரியாக கையாள:

<?php
$code = '<?php
$code = %c%s%c;
printf($code, 39, $code, 39);
';
printf($code, 39, $code, 39);

HQ9+

க்ளிஃப் பிஃபிளால் உருவாக்கப்பட்ட HQ9+ என்பது கடைசியாக ஆனால் முக்கியமானது:

Q
மீண்டும்