" karakter előtt \ karakter miért?

" karakter előtt \ karakter miért?
2010-02-21T22:06:36+01:00
2010-02-22T17:03:05+01:00
2022-11-16T18:40:33+01:00
Snailboy
Sziasztok!

a gond a következő lenne:

Mikor ezt beírom az admin felületen:


<a href="http://www.yahoo.com" target"_blank"img src="http://www.valami.hu/images/banner2.gif"></a>
akkor az így menti el mysql-ben:


<a href=\"http://www.yahoo.com\" target\"_blank\"img src=\"http://www.valami.hu/images/banner2.gif\"></a>

Tehát valamiért a " jel elé betesz egy \ jelet.

Az alábbi kódsornak lehet köze ehhez?


<?php /** * Smarty plugin * @package Smarty * @subpackage plugins */ /** * Smarty escape modifier plugin * * Type: modifier<br> * Name: escape<br> * Purpose: Escape the string according to escapement type * @link http://smarty.php.net/manual/en/language.modifier.escape.php * escape (Smarty online manual) * @author Monte Ohrt <monte at ohrt dot com> * @param string * @param html|htmlall|url|quotes|hex|hexentity|javascript * @return string */ function smarty_modifier_escape($string, $esc_type = 'html', $char_set = 'UTF-8') { switch ($esc_type) { case 'html': return htmlspecialchars($string, ENT_QUOTES, $char_set); case 'htmlall': return htmlentities($string, ENT_QUOTES, $char_set); case 'url': return rawurlencode($string); case 'urlpathinfo': return str_replace('%2F','/',rawurlencode($string)); case 'quotes': // escape unescaped single quotes return preg_replace("%(?<!\\\\)'%", "\\'", $string); case 'hex': // escape every character into hex $return = ''; for ($x=0; $x < strlen($string); $x++) { $return .= '%' . bin2hex($string[$x]); } return $return; case 'hexentity': $return = ''; for ($x=0; $x < strlen($string); $x++) { $return .= '&#x' . bin2hex($string[$x]) . ';'; } return $return; case 'decentity': $return = ''; for ($x=0; $x < strlen($string); $x++) { $return .= '&#' . ord($string[$x]) . ';'; } return $return; case 'javascript': // escape quotes and backslashes, newlines, etc. return strtr($string, array('\\'=>'\\\\',"'"=>"\\'",'"'=>'\\"',"\r"=>'\\r',"\n"=>'\\n','</'=>'<\/')); case 'mail': // safe way to display e-mail address on a web page return str_replace(array('@', '.'),array(' [AT] ', ' [DOT] '), $string); case 'nonstd': // escape non-standard chars, such as ms document quotes $_res = ''; for($_i = 0, $_len = strlen($string); $_i < $_len; $_i++) { $_ord = ord(substr($string, $_i, 1)); // non-standard char, escape it if($_ord >= 126){ $_res .= '&#' . $_ord . ';'; } else { $_res .= substr($string, $_i, 1); } } return $_res; default: return $string; } } /* vim: set expandtab: */ ?>

Eddigi és ez utáni segítségeteket is nagyon szépen köszönöm!
Mutasd a teljes hozzászólást!

  • Igen, lehet. És egyébként is így célszerű. Olvass utána egy picit az sql injection-nek. Arról nem beszélve, hogy a bemásolt kódban ott van a hivatkozást a kézikönyvre...
    Mutasd a teljes hozzászólást!
  • Egyes karakterek elé, mint pl az idézőjel, védőkaraktereket tesz a MySql mentés előtt. Ez ellen nem tudsz nagyon mit tenni, de mentés előtt amúgy is célszerű a szövegeket a mysql_real_escape_string() függvénnyel átalakítanod, amit kiolvasás után a stripslashes() függvénnyel kódolhatsz vissza, és akkor a kiolvasott érték már újra a \ jel nélküli szöveg lesz.
    Mutasd a teljes hozzászólást!
  • A kézikönyvből sajnos számomra nem derül ki semmi. A problémám továbbra is adott, pedig már lassan 8 órája ülök felette. bedobom a kódot, hátha valakinek lesz szabad 10 perce átfutni, mert én nem látom át sajnos ....


    <?php function ___removeBannerHome() { global $applyToAllBanner; $filter = ""; if (weAreMulticity() && !$applyToAllBanner) { $filter = " AND " .getCitySQL(); } DBquery("UPDATE ann_config SET value='0' WHERE param='BANNER_HOME' $filter"); DBquery("UPDATE ann_config SET value='' WHERE param='BANNER_HOME_CODE' $filter"); // now it has been removed } if($_SESSION["loggedInAdmin"]){ if($_POST["Submit"]==" ".__("Save")." "){ $applyToAllBanner = (isset($_COOKIE['allCitiesBanner']) && $_COOKIE['allCitiesBanner']==1); $applyToAll= (isset($_COOKIE['allCities']) && $_COOKIE['allCities']==1); setcookie('allCities', 0, 1, '/'); setcookie('allCitiesBanner', 0, 1, '/'); if ($_POST['catlist']!="") { $id_cat = $_POST["catlist"]; $htmlcode = $_POST["htmlcode"]; $htmlcode1 = $_POST["htmlcode1"]; if (!empty($_POST["cat"]))$cat = 1;if (!empty($_POST["ads"]))$ads = 1; if (!empty($_POST["LISTPOS"]))$LISTPOS = $_POST["LISTPOS"];if (!empty($_POST["ADSPOS"]))$ADSPOS = $_POST["ADSPOS"]; $new = htmlspecialchars($htmlcode, ENT_QUOTES); $new1 = htmlspecialchars($htmlcode1, ENT_QUOTES); $q="select count(*) as cnt from ann_banner where id_cat='$id_cat' "; // add the Adsense to the category "in general" addABanner($id_cat,$htmlcode,$htmlcode1,$cat,$ads,$LISTPOS,$ADSPOS); // now if we are in multicity $city = 0; if (weAreMulticity()) { $city = $_SESSION['id_city']; if ($applyToAll) { multicity_bindBannerToAllCities($id_cat, $LISTPOS, $ADSPOS); $subcats = getOurSubcategories($id_cat, $applyToAll); foreach ($subcats as $sc) { $scid = $sc['id_cat']; multicity_bindBannerToAllCities($scid, $LISTPOS, $ADSPOS); } } else { DBQuery("DELETE FROM ann_banner_city WHERE id_city=$city AND id_cat=$id_cat"); multicity_bindBanner($id_cat, $LISTPOS, $ADSPOS, $_SESSION['id_city']); $subcats = getOurSubcategories($id_cat); foreach ($subcats as $sc) { $scid = $sc['id_cat']; multicity_bindBanner($scid, $LISTPOS, $ADSPOS, $_SESSION['id_city']); } } } } if ($_POST["BANNER_HOME"]==1 && ADSENSE_HOME==0) { $code = mysql_escape_string($_POST['homeHTMLCode']);//, ENT_QUOTES)); $city = (weAreMulticity())?$_SESSION['id_city']:'0'; if ($applyToAllBanner) { DBQuery("DELETE FROM ann_config WHERE param='BANNER_HOME' OR param='BANNER_HOME_CODE'"); $city = 0; } DBquery("REPLACE INTO ann_config(param, value, id_city) VALUES('BANNER_HOME', 1, $city)"); DBquery("REPLACE INTO ann_config(param, value, id_city) VALUES('BANNER_HOME_CODE', '$code', $city)"); } elseif (ADSENSE_HOME==1 && $_POST['BANNER_HOME']==1) { echo '<script>alert("'.__("Warning! The banner block is already in use by an Adsense ad!").'");</script>'; } else { ___removeBannerHome(); } echo '<script>alert("'.__("Banner has been updated successfully").'");location.href=location.href;</script>'; } if($_POST["Submit"]==" ".__("Remove Code")." "){ $id_cat = $_POST["catlist"]; ___removeBannerHome(); //if (!empty($new)){ //$q="select count(*) as cnt from ann_banner where id_cat='$id_cat' "; //$res=DBquery($q);$total = $res[0]["cnt"]; //if ($total == 0){$q="insert into ann_banner VALUES('$id_cat','$htmlcode','$cat','$ads')";} else { $q="update ann_banner set htmlcode='', cat='0', ads='0',htmlcode1='',LISTPOS='0',ADSPOS='0' where id_cat='$id_cat' "; $res=DBquery($q); echo '<script>alert("'.__("Banner has been removed successfully").'");</script>'; //} } ?> <script type="text/javascript">mainmtabs.init("mainmnav", 6)</script> <? if (!empty($mytext)) echo "<br><br><br>$mytext<br><br><br>"; ?> <? print getBannerForm()?> <?}else{header("Location:home.htm");}?>

    köszönöm a türelmetek és a megértésetek!
    Mutasd a teljes hozzászólást!
  • Egyes karakterek elé, mint pl az idézőjel, védőkaraktereket tesz a MySql mentés előtt.


    Nem tesz. Ha TE nem teszel bizonyos karakterek, pl. " elé \-t, akkor a mysql nem biztos, hogy értelmezni tudja az sql-t. A kérdéses kódban dupla biztonság van valahol berakva, ha a \ még a tárolásnál is látszik.
    Mutasd a teljes hozzászólást!
  • A problémám továbbra is adott


    És mi a problémád? Mert alapból az abszolút nem probléma, ha a " karakterek előtt \ szerepel a db-ben. Tedd fel normálisan a kérdésedet és akkor segíteni is tudunk!

    Egyébként ott van a mysql_escape_string() (ami helyett a mysql_real_escape_string()-et kéne használni, lásd php manual), ami hozzáad egy \-t, de valszeg a magic_quotes_gpc beállításod is on-ha duplázódnak (ismét csak lásd a php manual-t) vagy a smarty_modifier_escape()-is átfuttatod. Bár a smarty_modifier_escape()-s kérdésedet meg nem értem, hiszen a mutatott 2. kódrészletben sehol sem látszik, hogy meghívnád. Itt pedig senki sem gondolatolvasó.
    Mutasd a teljes hozzászólást!
  • Ok.

    A gond az, hogy az admin felületen megadom egy banner vagy adsense kódot, ahogy azt pl. az első hozzászólásomban is írtam, és mikor elmentem beteszi a \ jelet a " karakter elé és így nem működnek a hivatkozások.

    A magic_quotes_gpc be van kapcsolva.

    Elnézést, ha félreérthetően írtam az előzőekben.
    Mutasd a teljes hozzászólást!
  • A magic_quotes_gpc be van kapcsolva.

    Szuper. Akkor:

    1. Olvasd el légyszíves a php.net-en, hogy ez mit jelent.
    2. Olvasd el légyszíves a php-net-en, hogy a mysql_escape_string() mit jelent.
    3. Nézd át a kódodat, hogy a smarty_modifier_escape()-t hol hívod meg 'quotes' paraméterrel, mert ez nem látszik a kódból. Ja, és nézd meg, hogy mit csinál ez a függvény ezzel a paraméterrel meghívva
    4. 1-3 pont eredménye alapján összerakhatod már a képet.

    Ha nem megy elsőre, akkor a kód megfelelő részein irasd ki az sql utasítást.
    Mutasd a teljes hozzászólást!
  • idézném rrggff hozzászólását:

    ...amit kiolvasás után a stripslashes() függvénnyel kódolhatsz vissza, és akkor a kiolvasott érték már újra a \ jel nélküli szöveg lesz.
    Mutasd a teljes hozzászólást!
  • Értem. Tehát szerinted egy db-ben fölösleges \ karakter javításának az a módja, hogy kiovasáskor kiszeded belőle a fölösleges \ karaktereket és nem az, hogy már be sem teszed őket
    Mutasd a teljes hozzászólást!
  • Hm... igazad van... szerintem az egyiket a magic rakja be - a másikat a
    preg_replace("%(?<!\\\\)'%", "\\'", $string);
    .

    Amiket el tudok képzelni:
    - Kikapcsolod a magic-et. ( lehet hogy máshol ahol nincs védve akkor védtelen lesz )
    - Turkálsz a function-be pl. minden bemenő paramétert stripslasheled:

    ... function smarty_modifier_escape($string, $esc_type = 'html', $char_set = 'UTF-8') { $string = stripslashes($string); ...

    Bár ezt a regexp-et nem teljesen értem...
    Mutasd a teljes hozzászólást!
  • Hm... igazad van... szerintem az egyiket a magic rakja be - a másikat a preg_replace("%(?<!\\\\)'%", "\\'", $string);.


    Grat, 2,5 órával később leírod ugyanazt, amit én írtam, csak azzal a különbséggel, hogy a mysql_escape_string()-ről megfeledkeztél

    - Turkálsz a function-be pl. minden bemenő paramétert stripslasheled:


    Ez meg külön tetszik . Tehát most már a db beírás előtt kiszeded a fölös \-t, ahelyett, hogy bele sem tennéd. Mondjuk úgy, hogy a case 'quotes': ágat kiveszed, vagy a kérdéses sql-re nem hívod meg az egész függvényt. Igazából azt sem tudjuk, hogy a nyitó hozzászólásban lévő függvényt mikor és hol hívja meg, mert az nem látszik a másik kódrészletből.
    Mutasd a teljes hozzászólást!
  • Betettem az ékezetes FAQ-ba, bár ahhoz semmi köze

    Ékezetes FAQ webművészek számára
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd