# Command Injection a chosc i PHP

> Command Injection i PHP a chosc: sliogán a sheachaint, proc_open le hearra, escapeshellarg a úsáid i gceart agus glaonna contúirteacha a aimsiú sa chód.

Foinse: https://phpsos.de/ga/blog/command-injection-php/  
Staid: 25/10/2026  
Soláthraí: PHP SOS, Cabhair éigeandála PHP agus slándáil freastalaí. Cabhair láithreach trí WhatsApp: https://wa.me/491736494914?text=Dia%20duit%2C%20a%20PHP%20SOS%2C%20t%C3%A1%20cabhair%20de%20dh%C3%ADth%20orainn%20len%C3%A1r%20bhfreastala%C3%AD%20PHP.%20Cuideachta%3A%20%E2%80%A6%20Su%C3%ADomh%20gr%C3%A9as%C3%A1in%3A%20%E2%80%A6

**Go achomair:** Cuireann tú cosc is sábháilte ar command injection i PHP trí gan sliogán ar bith a ghlaoch: déanann feidhmeanna PHP nó leabharlanna a lán tascanna go díreach. Nuair atá clár seachtrach de dhíth, tugann tú an t-ordú mar eagar do `proc_open()` ó PHP 7.4 i leith, agus tosaíonn PHP an clár gan sliogán. Seiceálann tú luachanna i gcoinne liosta ceadaithe, dúnann tú roghanna le `--` agus ritheann tú an próiseas le cearta íosta.

## Cén fáth a bhfuil an oiread sin cumhachta i nglao córais

Eagarthóireacht íomhá, giniúint PDF, cartlannú, scanadh víris, iarratas ar iontráil DNS: le haghaidh tascanna den sórt sin is maith le feidhmchláir PHP cláir sheachtracha a ghlaoch. Go teicniúil tá sé áisiúil, is leor líne amháin le `exec()` nó `shell_exec()`. Ó thaobh na slándála is ceann de na háiteanna is contúirtí sa chód é.

Nuair a chuirtear ordú le chéile mar théacs agus a ritheann sliogán é, cinneann an sliogán cad is ordú agus cad is sonraí ann. Má théann luach ón taobh amuigh isteach gan seiceáil, is féidir leis brí an ordaithe a athrú. Sa chás is measa is é an toradh an rud céanna le PHP2Shell: orduithe treallacha a rith ar an bhfreastalaí le cearta phróiseas PHP.

An difríocht: ceartaíonn tú PHP2Shell le nuashonrú PHP. Maireann command injection i gcód féin tar éis gach nuashonraithe. Ina theannta sin is minic a bhíonn a leithéid d'áiteanna i scripteanna cabhracha a bhí ceaptha do riarthóirí amháin, mar shampla le haghaidh cothabhála, diagnóise nó allmhairithe, agus a fhanann inrochtana níos déanaí gan chosaint.

## Cá dtagann command injection chun cinn i PHP

Tá gach áit i mbaol ina dtosaíonn PHP sliogán nó clár. Is iad na feidhmeanna chuige sin:

| Feidhm | An úsáideann sí sliogán? | Nóta |
|---|---|---|
| `exec()`, `system()`, `passthru()`, `shell_exec()` | úsáideann | Ordú mar théacs, léirmhíníonn an sliogán é |
| Oibreoir cúlgha | úsáideann | comhionann le `shell_exec()` |
| `popen()` | úsáideann | Ordú mar théacs |
| `proc_open()` le teaghrán | úsáideann | Ordú mar théacs |
| `proc_open()` le hearra | ní úsáideann | ó PHP 7.4, tugtar argóintí go díreach |
| `mail()` le cúigiú paraiméadar | go hindíreach | paraiméadair bhreise don chlár ríomhphoist |

Seo patrún tipiciúil neamhshlán. Tagann ainm an chomhaid ón iarratas agus críochnaíonn sé go díreach sa líne ordaithe:

```php
<?php
// NEAMHSHLÁN: Éiríonn luach ón iarratas mar chuid d'ordú sliogáin
$datei = $_POST['datei'];
exec('convert uploads/' . $datei . ' -resize 800x800 vorschau/' . $datei);
```

## An chéad rogha: gan sliogán ar bith

Is é an chosaint is éifeachtaí an glao córais a chur in ionad. Luann OWASP é sin go sainráite mar chéad líne chosanta. Do a lán tascanna tá feidhmeanna nó eisínteachtaí PHP dá gcuid féin ann:

- Eolairí agus comhaid: `mkdir()`, `copy()`, `rename()`, `unlink()`
- Cartlanna: `ZipArchive` nó `PharData`
- Íomhánna: GD nó Imagick mar eisínteacht PHP
- Fiosruithe líonra: `dns_get_record()`, `gethostbyname()`, cURL
- Suimeanna seiceála: `hash_file()`

Imíonn an cheist cé na carachtair a léirmhíníonn sliogán go hiomlán dá bharr. Ina theannta sin is féidir na feidhmeanna d'orduithe córais a bhlocáil sa chumraíocht ansin, mar a thuairiscíonn an treoir [disable_functions a úsáid i gceart](https://phpsos.de/ga/ratgeber/disable-functions/).

## Nuair atá clár seachtrach de dhíth: proc_open le hearra

Ó PHP 7.4 glacann `proc_open()` leis an ordú mar eagar. De réir lámhleabhar PHP tosaítear an próiseas go díreach ansin, gan dul trí shliogán, agus déanann PHP an éalú is gá d'argóintí. Níl brí speisialta ag carachtair ar nós leathstaid nó píopa a thuilleadh.

```php
<?php
declare(strict_types=1);

$name = basename((string) ($_POST['datei'] ?? ''));
if (!preg_match('/^[a-z0-9_-]{1,64}\.(jpg|png)$/', $name)) {
    throw new InvalidArgumentException('Ungültiger Dateiname.');
}

$befehl = ['/usr/bin/convert', '/srv/app/uploads/' . $name, '-resize', '800x800',
           '/srv/app/vorschau/' . $name];

$prozess = proc_open($befehl, [1 => ['pipe', 'w'], 2 => ['pipe', 'w']], $pipes);
if (!is_resource($prozess)) {
    throw new RuntimeException('Programm konnte nicht gestartet werden.');
}
$fehlerausgabe = stream_get_contents($pipes[2]);
$status = proc_close($prozess);
```

Déanann trí rud an sampla seo seasmhach: tá an clár socraithe sa chód le cosán iomlán, seiceáiltear ainm an chomhaid i gcoinne patrún caol, agus tosaíonn gach argóint athraitheach le cosán iomlán, mar sin ní féidir í a léamh mar rogha. San áit a bhfuil luach ina aonar, dún roghanna le `--`, má thacaíonn an clár leis de réir an doiciméadaithe, nó diúltaigh do luachanna a thosaíonn le fleiscín.

I gcás tascanna a mbíonn cláir sheachtracha de dhíth orthu go rialta, mar shampla próiseáil íomhá nó PDF ar scála níos mó, is fiú dícheangal: ní chuireann an feidhmchlár gréasáin ach tasc i scuaine, ritheann seirbhís chúlra scartha lena húsáideoir féin agus lena cearta féin é. Ní bhíonn feidhmeanna d'orduithe córais de dhíth a thuilleadh ar an bpróiseas PHP a fhreagraíonn d'iarratais ón idirlíon, agus is féidir iad a bhlocáil dó. Ba cheart teorainneacha ama agus cuimhne a bheith ag cláir sheachtracha freisin ionas nach gcuireann tasc aonair bac ar an bhfreastalaí.

Cás speisialta is ea `mail()`. Tugann an cúigiú paraiméadar roghanna breise do chlár ríomhphoist an chórais. Ní ceart luachanna ó fhoirmeacha, mar shampla seoladh seoltóra, a thuirlingt ansin gan seiceáil riamh. Is láidre leabharlann ríomhphoist a sheolann trí SMTP agus nach dteastaíonn glao córais uaithi.

## escapeshellarg: é a úsáid i gceart agus na teorainneacha a aithint

San áit a n-oibríonn cód atá ann cheana le línte ordaithe, is é `escapeshellarg()` don luach aonair gach uair an beart íosta. Cuireann an fheidhm an luach idir comharthaí athfhriotail, ionas go láimhseálann an sliogán é mar argóint amháin go díreach. Níl `escapeshellcmd()` oiriúnach d'ionchur úsáideora, mar ceadaíonn sé paraiméadair bhreise, mar a thaispeánann OWASP le sampla.

Teorainneacha tábhachtacha de chuid `escapeshellarg()`:

1. **Fanann argóint-injection indéanta:** Léann an clár sprice luach éalaithe a thosaíonn le fleiscín mar rogha fós.
2. **Iompraíonn Windows ar bhealach eile:** Ansin cuireann an fheidhm spásanna in ionad carachtar áirithe ar nós `%` agus `"` de réir an lámhleabhair; mar sin tagann luachanna athraithe.
3. **Tacar carachtar:** Ag brath ar shocrú locale an fhreastalaí, is féidir carachtair neamh-ASCII a chailleadh.

## Áiteanna a aimsiú sa chód atá ann cheana

Is tapa a dhéantar cuardach ar ghlaonna córais agus tugann sé liosta in-láimhseáilte:

```bash
grep -rnE "\b(exec|system|passthru|shell_exec|popen|proc_open)\s*\(" src/ --include="*.php"
grep -rn '`' src/ --include="*.php" | grep -v '^\s*//'
```

Teastaíonn freagra ar thrí cheist ó gach áit a bhfaightear rud: An féidir an glao a chur in ionad feidhmeanna PHP? An dtéann luachanna ón taobh amuigh isteach? Cé na cearta lena ritheann an próiseas? Is é an ceist deiridh an ceann cinniúnach don damáiste sa chás is measa. Déanann próiseas PHP lena úsáideoir féin agus gan cearta scríbhneoireachta ar an gcód níos lú damáiste, féach [Least Privilege: cearta úsáideoir an fhreastalaí gréasáin](https://phpsos.de/ga/blog/rechte-des-webserver-benutzers/).

> **Tábhachtach:**
> Má thosaíonn próiseas PHP-FPM nó freastalaí gréasáin sliogán, is comhartha rabhaidh láidir é de bhriseadh isteach. Déanann [Comhartha rabhaidh: tosaíonn an freastalaí gréasáin sliogán](https://phpsos.de/ga/blog/webserver-startet-shell/) cur síos ar conas é sin a aithint.

## Conas a chabhraíonn PHP SOS go nithiúil?

- Lorgaímid gach glao córais i d'fheidhmchlár, i bhforlíontáin agus i scripteanna cabhracha.
- Cuirimid feidhmeanna PHP in ionad glaonna nuair is féidir, agus aistrímid na cinn eile go glaonna gan sliogán.
- Blocálaimid feidhmeanna nach bhfuil de dhíth i gcumraíocht PHP agus seiceálaimid cearta úsáideoir PHP.
- Déanaimid na hathruithe a thástáil agus a dhoiciméadú cé na cláir a cheadaítear don fheidhmchlár a ghlaoch fós.

Tairgimid seiceáil ar bhogearraí féin mar [iniúchadh slándála agus tástáil threáite](https://phpsos.de/ga/leistungen/sicherheitsaudit-penetrationstest/).


## Ceisteanna coitianta

**An leor escapeshellarg i gcoinne command injection?**  
Cuireann sé cosc ar luach a rith mar ordú breise. Ní chuireann sé cosc ar an luach a léamh mar rogha den chlár a ghlaoitear, má thosaíonn sé le fleiscín. Dá bhrí sin seiceáil luachanna ina theannta sin agus, san áit a dtacaíonn an clár leis, rogha a dhúnadh le --.

**Cad é an difríocht idir escapeshellarg agus escapeshellcmd?**  
Láimhseálann escapeshellarg luach aonair mar argóint amháin go díreach. Ní éalaíonn escapeshellcmd ach meiteachairaicléir i líne iomlán ordaithe agus ceadaíonn sé paraiméadair bhreise. Do ionchur úsáideora is é escapeshellarg an rogha cheart, agus is fearr fós glao gan sliogán.

**An ceart dom exec agus system a bhlocáil le disable_functions?**  
Mura bhfuil siad de dhíth ar d'fheidhmchlár, ba cheart. Teorannaíonn sé sin an damáiste tar éis briseadh isteach. Ach ní thagann sé in ionad cód slán, mar teastaíonn na feidhmeanna fós ó fheidhmchláir a bhfuil orduithe de dhíth orthu.

**Conas a aithním an ndearnadh leas as command injection?**  
Is comhartha rabhaidh láidir iad próisis PHP nó freastalaí gréasáin a thosaíonn sliogán ar nós sh nó bash. Ina theannta sin próisis anaithnide, comhaid nua i bhfillteáin uaslódála agus naisc amach neamhghnácha.

## Foinsí

- [OWASP OS Command Injection Defense Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/OS_Command_Injection_Defense_Cheat_Sheet.html)
- [Lámhleabhar PHP: proc_open](https://www.php.net/manual/de/function.proc-open.php)
- [Lámhleabhar PHP: escapeshellarg](https://www.php.net/manual/de/function.escapeshellarg.php)
