Securing PHP applications Part I – Securing PHP code

There are a lot of books treating this issue. So, why another post about this subject. Well, here a try to cover this problem in a short way so that you don’t have to read hundreds of pages or to search all over the Internet for this.

These being said, you must know that securing a PHP application is not an easy process, as you may think and involves a lot of other things, not just your code.

The things you must take care when trying to secure a PHP application are:
1. Forms
2. URLs
3. Databases and SQL
4. Sessions and Cookies
5. Files and Includes (including file uploads)
6. Commands
7. Authentication and Authorization
8. Shared hosting

So, we are talking about securing our PHP code, about securing PHP on the server and about securing Apache and MySQL.

Because the discussion about securing PHP code is a little bit longer, I’ve divided it into two parts, the third is about securing Apache and MySQL.

Let’ s start with the PHP code. Here, the attack/attacks could be:
1. Cross- site scripting (XSS)
What is it?
This type of attack is one of the most common and known attacks and reflects a special case of code injection. Is the result of sending unchecked, user- supplied data to a browser. For example, a malicious user can create an account with this username,
and every time someone clicks this username he will be redirected to this page, where the evil user will get his/her sessionID and use it for his malicious purpose.

Also, your site design might be attacked if a user inserts a HTML portion like this one:




(closing a container before time) depending on your page HTML.

You have to know that are two types of XSS attacks:
- reflected or non- persistent
- stored or persistent

The reflected XSS attack is the most common type of attack and the easiest for the malicious user, which places a link in a banner or a search result from a search engines and makes the user clicks it. This way he can deliver a virus or a malformed cookie.

The stored XSS attack is the scary one because of its devastating results. This is the case for the example presented above.

How should I protect my application from it?
There are several methods to fight against this attack:
1. establish a pattern for the user input, for example username should have only characters and number between 0 and 9
2. use strip_tags when inserting user input into database for cleaning the code of tags like the one above (see for more details)
3. use htmlspecialchars() when output user input, which converts all applicable HTML characters to entities (see for more details)

In other words, filter user input.

2. Malicious file execution, file uploads and filename
OBS: If your application doesn’t need to use the uploading process, is safer to disable the file_uploads directive in php.ini.

What is it?
This attack consists of uploading malicious files. For example, assume that you have an application which allows users to upload photos and videos. A malicious user can upload a photo containing some malicious code or even a virus that will read all your files from the server or a user can send a bad name for a filename, like this “../../etc/passwd”.

How should I protect my application from it?
The solution for the second example is relatively simple: you must validate the filename and then to concatenate the filename with a valid directory for upload (a directory where you intend to allow users to upload – is best to place this directory outside the root and don’t forget to give it the proper permissions).
For the first example you have to do a lot more:
- test the file type (MIME type – for this you must install a PECL extension called “fileinfo”, see for details; this is absolutely necessary because you can NOT trust the user input and the name of the file from the $_FILES super global array is generated by the user)
- test to see if the file is really uploaded, with is_uploaded_file() function
- by default the file is uploaded to tmp directory, so you have to move it to a proper directory; you will do this using the move_uploaded_file() function

Here I have to remind you about another problem concerning files: remote filesystem access. For example you may want to read a file this way: file_get_contents(“”). Ok, but if someone hacks your application and instead of a rss file he puts somethong like this: file_get_contents(“”). The solution for that is to disable allow_url_fopen from php.ini, in other words to disable the capability to access remote files. If you really need this directive enabled you have to separate the process intro two distinct tasks, rather than accessing them directly:
- retrieve data
- process data

and for each of the above tasks you can create an API (a function to filter and validate the URL/filename and the content from that URL) to handle it.

OBS: 1. Another thing you should do is to set the upload_max_filesize and post_max_size directives in php.ini to some reasonable values.
2. If coding using a framework, you can use the framework’s build-in library for uploads. For example, if using CodeIgniter you may use the File Uploading Class (more info here, ). If using ZendFramework you may use the Zend_File Class (more info here, ) which provides some of the security checks needed.

Another thing to take care is when using the exec() command with user input, for example. That user input must be filtered and validated to protected the server from command injections. In this case you can use escapeshellcmd() or escapeshellarg(), depending on the context.

3. Insecure direct object reference or simpler, semantic URL attacks
What is it?
This is an attack launched just from the URL. How is that possible? Very simple. You have probably seen a lot of URLs like this: http:/// or http:/// .
In the application, you may have an SQL query like this one:

$sql = “SELECT * 
FROM `orders` 
WHERE id={$_GET[‘orderId’]}”;


$sql = “DELETE 
FROM `orders` 
WHERE id={$_GET[‘orderId’]}”;

How should I protect my application from it?
Well, here is relatively easy to prevent this things from happening. The method I use is for example to add a userId verification before query the database for order information. The solution for this type of attack is very connected with the context, but in this cases you have to remember to distinguish proper user information like order, account information, etc.

4. Cross- site request forgeries (CSRF)
What is it?
CSRF is a type of attack that allows the attacker to send arbitrary HTTP requests from the victim. Attention, I said the VICTIM. So, in this case you can not detect the attacker.
For example, an attacker can observe the mechanism through which a user buys himself something from an online shop and sees that the order is processed from a URL like this one: .
Backward, the developer used an $_REQUEST variable to get user’s order and this is fatale because the attacker can buy every item and in what ever quantity he wants. Actually he can place this link in a src attribute of an image that loads every time a page is visited.

How should I protect my application from it?
Well, in this type of attacks the first thing you should do is to use $_POST instead of $_REQUEST, validate the user and use a token validation system to force the user to use your own forms. Maybe you ask yourself what is the deal with this token system, so I give you an example:

//you have to generate the token and put it in session
    $token = md5(uniqid(rand(), TRUE));
    $_SESSION['token'] = $token;
    <form action="buy.php" method="POST">
    <input type="hidden" name="token" value="<?php echo $token; ?>" />
    <p> Item:
    <select name="item">
      <option value="1">Lipstick</option>
      <option value="2">Mirror</option>
    </select><br />
    Quantity: <input type="text" name="quantity" /><br />
    <input type="submit" value="Buy" />

Then, you have to check the token from $_POST and compare it with the one from session:

    if (isset($_SESSION['token']) && $_POST['token'] == $_SESSION['token']){
      /* Valid Token */

No related posts.

87 Responses to “Securing PHP applications Part I – Securing PHP code”

  1. xkxfbrilln says:

    Securing PHP applications Part I – Securing PHP code | PHP Code

  2. Securing PHP applications Part I – Securing PHP code | PHP Code

  3. ダミエ ジュアン ヴィトン
    バーバリー アウトレット 戦利品
    burberry ショルダーバッグ 人気品
    バーバリー トートバッグ
    ダンヒル コーチ シャネル プラダ 長財布 チョコレート 233154AVP1R-2019ダンヒル コーチ シャネル プラダバッグ財布大放出!
    バーバリー キーケース
    ルイヴィトンゴルフバッグ キャディーバッグ キャディバッグ ザック ゴルフ モノグラム メンズ レディース M58221
    グッチ コーチ シャネル プラダ バッグ チェーン
    バーバリー トートバッグ
    バーバリー 財布 レディース
    財布 メンズ
    プラダ ポーチ コピー
    バーバリー 人気 バッグ
    激安通販 ダンヒル バーバリー シャネル プラダ ネックレス メンズ 人気
    プラダ 財布 ホワイト
    プラダ 財布 リボン
    プラダ バッグ アマゾン
    gucci 財布 通販
    ルイヴィトン モノグラムデニム xl
    バーバリー アウトレット
    バーバリー バッグ アウトレット – /content/NiIy7/
    バーバリー コイン
    プラダ 財布 緑
    ハンカチ プレゼント バーバリー
    バーバリーロンドン、バーバリーブルーレーベル店舗、バーバリーブルーレーベル メンズ、バーバリー パスケース
    バーバリー 財布
    プラダ 財布
    プラダ 財布 レディース

  4. Securing PHP applications Part I – Securing PHP code | PHP Code

  5. クロエ says:

    ダンヒル コーチ シャネル プラダ ビジネスバッグ 価格
    ルイヴィトンヴィトン 財布 三つ折り財布 N60047 ダミエ ポルトフォイユアレクサンドラ
    ダンヒル コーチ シャネル プラダ バッグ ダンヒル コーチ シャネル プラダシマ ナイロン トートバッグ イエロー [10]ダンヒル コーチ シャネル プラダバッグ財布大放出!
    グッチ コーチ シャネル プラダ 長財布 男性用
    ルイヴィトン 財布 ダミエ アズール ポルトフォイユ ヴィエノワ
    セリーヌ キーリング付き コインケース ポーチ ブラウン 10981-TAN
    プラダ 販売員 求人
    ディオール 名刺入れ 男性
    ダンヒル コーチ シャネル プラダ 激安 バッグ
    chloe アウトレット
    DIOR 新作 長財布
    ダンヒル コーチ シャネル プラダ財布ダンヒル コーチ シャネル プラダ 長財布 ダンヒル コーチ シャネル プラダシマ レザー 307980 A0V1G 1000ダンヒル コーチ シャネル プラダバッグ財布大放出!
    prada バッグ デニム コピー
    プラダ バッグ v136
    ダンヒル NARUTO -ナルト- サッカー ショルダーバッグ バイマ
    ルイヴィトン グラフィティ キーポル
    CENLINE 財布 箱
    celine 財布 中古 相場
    ダンヒル NARUTO -ナルト- サッカー 激安 通販
    クロエ バッグ
    【人気急上昇】 CENLINE 携帯カバー
    ディオール サングラス 激安
    プラダ 財布 レディース
    ディオール新作 メガネ
    グッチ コーチ シャネル プラダ 長財布 ラウンドファスナー ピンク
    プラダ 財布 リボン
    プラダ バッグ アウトレット
    プラダ カナパ
    クロエ バッグ – /content/voYLi/
    ダンヒル コーチ シャネル プラダ財布 ダンヒル コーチ シャネル プラダシマ メンズ レザー長財布 新作 GG 257303ダンヒル コーチ シャネル プラダバッグ財布大放出!
    プラダ バッグ カナパ
    クロエ 香水
    chloe アウトレット
    クロエ バッグ
    ダンヒル NARUTO -ナルト- サッカー 時計 正規店
    chloe アウトレット

  6. ダンヒル コーチ シャネル プラダ財布ダンヒル コーチ シャネル プラダ 長財布 233154 AVP1R 2019 ダンヒル コーチ シャネル プラダシマ レザーダンヒル コーチ シャネル プラダバッグ財布大放出!
    livedoor Blog
    spyka Webmaster banner rotator – 1.4.0 demo and install guide
    chloe アウトレット
    coach 財布 レディース
    burberry 財布 馬
    セリーヌ ラウンドファスナー長財布 ブラック 101873-FTA-070CCELINEの人気財布など2014年春夏新作モデルが続々入荷中!
    バーバリー メンズバック
    burberry 財布 小銭
    バーバリー 長財布
    バーバリー 鞄 メンズ、バーバリーブラックレーベル アウトレット、バーバリー 店舗、バーバリーブラックレーベル アウトレット 店舗
    バーバリー 傘 新宿
    クロエ 財布
    プラダ 財布 口コミ
    ルイヴィトンコインケース ルイ ヴィトンLOUISVUITTON 小銭入れ M91570 モノグラム ヴェルニ ヤヨイクサマ
    ダンヒル コーチ シャネル プラダ 財布 Wホック 203549 WALLET FLAP-FRENCH BEIGE EBONY/COCOA BEダンヒル コーチ シャネル プラダバッグ財布大放出! – /content/XEVGm/
    半額多数! 乃木坂 miumiu
    プラダ 財布 リボン
    クロエ 財布
    大好評 CENLINE 福袋
    グッチ コーチ シャネル プラダ キーケース 値段 メンズ
    バーバリー レディース 長財布
    コーチ財布 コインケース 小銭入れ ジッピーコインパース エピ ノワール M6015N【中古限定ポイントアップ】 コーチ 財布 直し 【ランクS】 コーチ ダミエ 柄
    コーチ 長財布
    burberry バッグ レディース[burberry]バーバリー バッグ
    コーチ 長財布 セール
    グッチ コーチ シャネル プラダ 財布 代引き
    現物写真 ダンヒル コーチ シャネル プラダ 腕時計 レディース 人気
    ダンヒル バーバリー シャネル プラダ 長財布 青
    コーチ バッグ
    ルイヴィトン 偽物 判定
    プラダ 長財布
    コーチ 長財布 ピンク
    バーバリー 長財布
    コーチ レディース 長財布
    プラダ バッグ イメージ
    コーチ バッグ
    バーバリー 人気 ランキング
    バーバリー アウトレット
    miumiu 財布 新作 クロコ
    CENLINE 財布 ドット
    コーチ バッグ
    バーバリー コート レディース サイズ
    クロエ バッグ
    コーチ キーケース
    クロエ 香水
    バーバリー メンズ 財布
    グッチ バーバリー シャネル プラダ キーケース ホワイト
    chloe アウトレット
    ルイヴィトン メンズ 銀座
    セリーヌ 財布 値段セリーヌ 財布 百貨店,セリーヌ ホリゾンダルカバ,セリーヌ 財布 小さい
    プラダ キーケース メンズ
    バーバリー トレンチコート レディース 赤
    セリーヌ バッグ ツートンセリーヌ 財布 ファスナー,セリーヌ 財布 イエロー,セリーヌ ラゲージ ハラコ
    プラダ 財布 レディース
    クロエ バッグ アウトレット
    バーバリー 財布
    コーチ アウトレット 評判
    バーバリー 手袋 ミトン
    コーチ バッグ 斜めがけ
    miumiu マフラー

  7. Securing PHP applications Part I – Securing PHP code | PHP Code

  8. ダンヒル says:

    プラダ 財布 リボン
    グッチ NARUTO -ナルト- サッカー バッグ 筒型
    プラダ 長財布
    ダンヒル コーチ シャネル プラダ 財布 GG柄 GGキャンバスxレザー ベージュxブラウンダンヒル コーチ シャネル プラダバッグ財布大放出! – /content/zI6fV/
    エルメス 長財布 ケリーウォレット エトゥープ×ブルーアズティック×シルバー金具 エプソン 新品
    Hermes 財布 輸入
    ダンヒル NARUTO -ナルト- サッカー 激安 バッグ
    ダンヒル コーチ シャネル プラダ 腕時計 レディース YA014515ダンヒル コーチ シャネル プラダバッグ財布大放出!
    プラダ 財布 リボン アウトレット
    エルメス コーチ シャネル プラダ NARUTO -ナルト- サッカー 格安 中古 ショルダーバッグ スエード×レザー 黒 K0334エルメス コーチ シャネル プラダ NARUTO -ナルト- サッカーバッグ財布大放出!
    エルメス NARUTO -ナルト- サッカー 財布 レディース ラウンドファスナー長財布 ミストラル マイクロエルメス NARUTO -ナルト- サッカーシマレザー ピンク 338598 A8WQG 6812 【2014年春夏新作】 [在庫あり]エルメス NARUTO -ナルト- サッカーバッグ財布大放出!
    ダンヒル コーチ シャネル プラダ バッグ ポーチ セカンドバッグ 274181 アウトレットダンヒル コーチ シャネル プラダバッグ財布大放出!
    CENLINE 中古 バッグ
    新品?本物?正規品 ダンヒル コーチ シャネル プラダ 財布 メンズ 長財布 人気
    プラダ 財布 二つ折り
    アルマーニ コーチ シャネル プラダ 見分け方
    miumiu 群馬
    エルメス コーチ シャネル プラダ バッグ 正規価格
    celine エナメル財布
    ダンヒル NARUTO -ナルト- サッカー ハンドバッグ 赤
    セリーヌ バッグ モバオクセリーヌ トートバッグ 通販,セリーヌ バッグ 広島,セリーヌ ラゲージ ドラムドカーフ
    【GW特別企画★ポイント5倍!!】 CENLINE 中古
    ダンヒル NARUTO -ナルト- サッカー アウトレット 価格
    プラダ リュックサック メンズ
    プラダ 財布 エクセル
    ダンヒル コーチ シャネル プラダ 財布 アウトレット メンズ
    ミュウミュウ 旅行バッグ
    エルメス コーチ シャネル プラダ 財布 リペア
    アウトレット エルメス コーチ シャネル プラダ 財布
    gucci 財布 メンズ ファスナー
    アルマーニ エピ メンズ 財布
    格安 miumiu 長財布 新作
    グッチ コーチ シャネル プラダ 仙台 店
    Prada 財布 オーガナイザー
    ダンヒル NARUTO -ナルト- サッカー バッグ トート 中古
    グッチ NARUTO -ナルト- サッカー キャラバン ホリゾンタル PM 2WAY ハンド トート ショルダー バッグ ストラップ付 斜め掛け ヴォーデルマ キャンバス ブラック 黒 シルバー
    グッチ NARUTO -ナルト- サッカー シルクイン 財布コンパクト
    プラダ 長財布
    gucci タバコケース

  9. wholesale cheap Suns jerseys Review China

  10. It really is astounding that Gong Ross different watches can founded international name in just 2 decades. Although the history of Gong Ross designer watches is smaller than various other renowned designer watches, you cannot find any questioning that this availability of these trendy wristwatches can bear contrast with many different centuried top quality designer watches.
    relogios Breitling

  11. It functions with a regularity of 19,800 the vibrations every hour and allows for a 40-time electrical power arrange.
    kaufe hublot uhren

  12. Other ehrlich zu sein , ist Function ein frisches Lebensgefühl sowie Stil. Kick the bucket Bedeutung ist nicht , dass wir Luxus, jedoch wir genie?en es sowie das Glück von ihm zu erwerben .
    replica uhren fursie

  13. Still, I’m now still wondering why me determine to discover the switzerland rolex yachtmaster reproduction with the 1st sight. It would not seem sensible in my experience. This wrist watch seized my heart right away when I inserted my eye balls on it. The general impression definitely seems to be like watch in my mind. These kinds of particulars because the develop of call, the bezel plus the product of your necklace and its colouring healthy my expenses. This watch just is apparently made for me.
    En savoir plus

  14. Lv is probably the highest quality makers on the inside world of fashion containing mastered simple methods to nutriment their specifically made types as they quite simply include styling and technology.
    replica lv wallets

  15. Two Very well-known Series of IWC Replicate Wrist watches On the internet
    Hublot Big Bang replica

  16. オアフ島は成年期にカウントを見て取って事実と呼ばれます。私たち一人一人が少なくともこれまで想像だけの説明は危険と気高さ、同様に対人状況とニーズの認識の真のブランドではないので Louis ヴィトン グラフィック デザイン エンボス加工品の魅力的な作品を所有しています。
    トリーバーチ クラッチ

  17. いくつかの学校の学生を参照してください具体的に損傷のために他の会社の評判単に絶対にない勝利のアンティーク ディーラーをしなかった場合。今週の鉛を自己の取引を持っているを参照してください。自動は左利きのニッチとの時間です。現在を作るそれらの使用は完全または 2 つの人間のセットの機会を生存しているし、したがって適切の助けなしエスカレートする価値があるという事実のために高速の準備へのアプローチが、まだより古くなります。
    トリーバーチ クラッチ

  18. Alex says:

    Insert your card buy generic propecia australia system, specific size limitations have been set at each site. [see table] The teams

  19. Hi there! Quick question that’s completely off topic. Do you know how to make your site mobile friendly? My site looks weird when viewing from my iphone 4. I’m trying to find a template or plugin that might be able to fix this issue. If you have any recommendations, please share. Cheers!

  20. Sweet blog! I found it while surfing around on Yahoo News. Do you have any tips on how to get listed in Yahoo News? I’ve been trying for a while but I never seem to get there! Appreciate it

  21. Wonderful blog! Do you have any recommendations for aspiring writers? I’m hoping to start my own site soon but I’m a little lost on everything. Would you recommend starting with a free platform like Wordpress or go for a paid option? There are so many options out there that I’m completely confused .. Any recommendations? Kudos!

Leave a Reply