Php post yöntemi ile değişkenler gibi garip metni Passing

6 Cevap php

Ben garip bir sorun var. Firmamız veri toplar ve biz görüşme bizim telefonun tüm işlemek için yazılım KORKUNÇ parça kullanın. Bu ikili dosyaları yerine SQL kullanır ve hiçbir sıkıştırma kullanır. Şu an itibariyle biz el müşteriler için tüm raporları çalıştırmak zorunda. Ben bizim veri ve ortak raporları için bir web arayüzü oluşturmaya çalışıyorum.

Şimdi sunucuya web bir "select ifadesi" denilen nedir geçmesi gerekiyor ve ben php sonrası yöntemi ile bunu. Sorun web tarayıcıları seçin tablolarda kullanılması gereken bazı karakterler gibi görünmüyor olmasıdır. Ben bunları kodlayan denedim ama sonra tarayıcılar otomatik geri onlar köprüler düz metin onları uncode.

İşte bazı örnek seçin ifadelerdir.

[3023.2#1] 
[3023.2$] = "1"
[3023.2<>1]
[500.10$] = "Name"

Ve url benzeyecektir

CustomReport.php?type=1&select="[3023.2#1]"

Ben sorun, farklı select ifadeleri kullanılan tırnak bağlı web kırmak olduğunu. = [3023,2 <> 1] alışkanlık iş seçmek ancak seçin = "[3023,2 <> 1]" yapar. Ben seçerim ANCAK = [3023,2 # 1] bu iş olacak ve tırnak kullanarak kıracak. Bu WebDev çubuğu ne kundakçı raporu herhangi bir hata, ne kırar ama ne zaman ve onun bariz benim DIV'leri tüm karışmış.

Ben de hiçbir yerde olduğunu eklemek sitede gösterilen select ifadesi gerektiğini, bu yüzden sadece bu sitemde tatili neden olarak gerçekten kafam karıştı bir exec komutu parçası olarak php kullanılır.

/Ropes End
//Probably something stupid

6 Cevap

Sen rawurlencode ve htmlentities araştırma istiyorum. Onlar size son derece yardımcı olacaktır.

Aside: The note from anonymous to be cautious passing executable commands over urls MUST be heeded. It sounds like your application is not on the public web, but if it is you need to be mindful of the security issues associated with that.

<?php 

$select_statements = array(
    '[3023.2#1]',
    '[3023.2$] = "1"',
    '[3023.2<>1]',
    '[500.10$] = "Name"',
);

foreach ($select_statements as $ss) {
    print htmlentities($ss);
    print "<br>";
    $url = $_SERVER['PHP_SELF'] . "?type=1&amp;select=" . rawurlencode($ss);
    print "<a href=\"{$url}\">{$url}</a>";	
    print "<br>";
    print "<br>";
}

print htmlentities($_GET['select']);

?>

(Benim için) Sonuçları:

[3023.2#1] /CustomReport.php?type=1&select=%5B3023.2%231%5D

[3023.2$] = "1" /CustomReport.php?type=1&select=%5B3023.2%24%5D%20%3D%20%221%22

[3023.2<>1] /CustomReport.php?type=1&select=%5B3023.2%3C%3E1%5D

[500.10$] = "Name" /CustomReport.php?type=1&select=%5B500.10%24%5D%20%3D%20%22Name%22

Ve ben bir bağlantıya tıklarsanız ben de tabii, ben Düzgün html varlıkları içine koymak içeri koymak seçmek hangisi göreceksiniz.

Ve url kodlama sadece seçme bölümünü denedi?

$queryString = 'select=' . urlencode($select);

Parametrelerin her biri için, urlencode karakterleri kaçmak için kullanmak gerekir:

$select = urlencode("[3023.2#1]");

ile http://us2.php.net/urlencode

Lütfen seçin dizeleri urlencode / urldecode fonksiyonlarını kullanmayı deneyin. Bu doğru tüm garip karakterleri kodlamak gerekir.

Ayrıca exec komutu ile dikkatli olun. Onun uygun ama tehlikeli.

Ayrıca POST kullanarak vazgeçmek olabilir. Bunun yerine, o zaman bir sonraki sayfada işleme almak, bir oturum değişkeni, veritabanı veya geçici dosya deyimi saklayın.

Eğer bir veritabanı kullanıyorsanız, tuhaf karakterleri işlemek için izin vermelidir utf8 kodlama ile bir ikili türü metin alanını kullanın.

Neden doğrudan sorgu deyimi oluşturmak için GUI değerleri kullanıyorsunuz? Sen aklı başında değerlere bir harita ve sadece web istemcisi gelen aklı başında değerlerin dışında sunucuda saklanıyor bu "sorguları" tüm olmalıdır:

 $queries = Array(
       'meaningfulname1' => '[3023.2#1]',
       'meaningfulname2' => '[3023.2$] = "1"',
       'meaningfulname3' => '[3023.2<>1]',
       'meaningfulname4' => '[500.10$] = "Name"',
 );

Sonra URL basitçe

 CustomReport.php?type=1&select=meaningfulname1

Şimdi kolaylıkla yazılım tarafından gerekli doğru kod dizisi içine "meaningfulname1" çevirebilir ve tarayıcıya backend delilik teşhir edilmez. Bu da bir şekilde (SQL gibi) diğer bazı sorgu dili kullanmak için arkaplana düzeltmek eğer GUI katmanı kodlamak gerek duymazsınız. Hala meaningfulname1 ister.