PHP: Hochkomma für MySQL/MariaDB maskieren? – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self PHP: Hochkomma für MySQL/MariaDB maskieren? Mon, 11 Oct 21 09:25:23 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792329#m1792329 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792329#m1792329 <p>Hi(gh)!</p> <p>PHP (Version 7.4.5) schmeißt mir beim Versuch, eine Abfrage abzuschicken, die den String "Gene Roddenberry's Andromeda" enthält, eine Fehlermeldung:</p> <p>"Die Abfrage kann nicht ausgeführt werden. Fehler: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 's Andromeda'' at line 1"</p> <p>Ich vermute, dass es an dem Hochkomma liegt... leider ändert sich auch bei Verwendung von mysqli_real_escape_string() nichts! Was mache ich falsch?</p> <p>Bis bald im Khyberspace!</p> <p>Yadgar</p> PHP: Hochkomma für MySQL/MariaDB maskieren? Mon, 11 Oct 21 09:37:21 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792332#m1792332 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792332#m1792332 <p>Hallo,</p> <blockquote> <p>PHP (Version 7.4.5) schmeißt mir beim Versuch, eine Abfrage abzuschicken, die den String "Gene Roddenberry's Andromeda" enthält, eine Fehlermeldung:</p> <p>"Die Abfrage kann nicht ausgeführt werden.<br> Fehler: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 's Andromeda'' at line 1"</p> <p>Ich vermute, dass es an dem Hochkomma liegt... leider ändert sich auch bei Verwendung von mysqli_real_escape_string() nichts! Was mache ich falsch?</p> </blockquote> <p>du lässt uns nicht wissen, wie dein SQL-Query genau aussieht, und wo oder wie du mysqli_real_escape_string() anwendest. So kann man nur im Nebel stochen. Und ich sehe ganz diffus im Nebel, dass du mysqli_real_escape_string() auf den gesamten Query-String anwendest, anstatt nur auf die darin enthaltenen Daten-Strings.</p> <p>Das ist aber wirklich nur eine diffuse Vermutung, denn bei richtiger Verwendung von mysqli_real_escape_string() sollte gerade so etwas, was du beschreibst, nicht passieren.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Ich bin subfontanell spärlich möbliert. - (Kommentar eines Kandidaten der Quiz-Show "<em>Gefragt, Gejagt</em>" zu seinen eigenen geistigen Leistungen) </div> PHP: Hochkomma für MySQL/MariaDB maskieren? Mon, 11 Oct 21 10:45:03 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792338#m1792338 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792338#m1792338 <p>@@Yadgar</p> <blockquote> <p>Ich vermute, dass es an dem Hochkomma liegt... leider ändert sich auch bei Verwendung von mysqli_real_escape_string() nichts! Was mache ich falsch?</p> </blockquote> <p>Du verwendest ' U+0027 anstelle eines Apostrophs ’ U+2019.</p> <p>Bei richtiger Zeichensetzung („Gene Roddenberry’s Andromeda“) können solche Probleme gar nicht auftreten.</p> <p>Wenn Inhalte nicht nur von dir kommen, sondern auch von anderen (die sowas wie ' oder " verwenden), müssen die Zeichen natürlich dem Kontext entsprechend behandelt werden.</p> <p> LLAP</p> <div class="signature">-- <br> <em>„Dann ist ja auch schrecklich, dass wir in einem Land leben, in dem nicht nur Bildungswillige leben, sondern auch hinreichende Zahlen von Bekloppten. Das darf ich so locker formulieren, ich bin ja jetzt Rentner und muss nicht mehr auf jedes Wort achten.“</em><br> — Joachim Gauck über Impfgegner </div> PHP: Hochkomma für MySQL/MariaDB maskieren? Mon, 11 Oct 21 11:30:50 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792348#m1792348 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792348#m1792348 <p>Hi(gh)!</p> <p>Ich habe es jetzt mit htmlspecialchars() probiert... aber htmlspecialchars("Gene Roddenberry's Andromeda") ergibt nach wie vor "Gene Roddenberry's Andromeda" (und damit weiterhin den MySQL-Error) und nicht etwa "Gene Roddenberry&#039;s Andromeda", wie es laut https://www.php.net/manual/de/function.htmlspecialchars.php sein müsste (und wie auch in phpmymyadmin der entsprechende Eintrag in der Tabelle STICHWOERTER angezeigt wird)!</p> <p>Warum bekomme ich das nicht hin? Ist eventuell die Maskierung von HTML Special Characters auf meinem lokalen Server nicht aktiviert? Wo in phpinfo() kann ich das nachsehen?</p> <p>Bis bald im Khyberspace!</p> <p>Yadgar</p> PHP: Hochkomma für MySQL/MariaDB maskieren? Mon, 11 Oct 21 09:55:11 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792334#m1792334 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792334#m1792334 <blockquote> <p>Hallo,</p> </blockquote> <blockquote> <p>du lässt uns nicht wissen, wie dein SQL-Query genau aussieht, und wo oder wie du mysqli_real_escape_string() anwendest. So kann man nur im Nebel stochen. Und ich sehe ganz diffus im Nebel, dass du mysqli_real_escape_string() auf den gesamten Query-String anwendest, anstatt nur auf die darin enthaltenen Daten-Strings.</p> <p>Das ist aber wirklich nur eine diffuse Vermutung, denn bei richtiger Verwendung von mysqli_real_escape_string() sollte gerade so etwas, was du beschreibst, nicht passieren.</p> </blockquote> <p>Der Code:</p> <pre><code class="block"> $stichwort = $_POST["stichwort"]; $stichwort = mysqli_real_escape_string($db, $stichwort); $kategorie = $_POST["kategorie"]; $kategorie = mysqli_real_escape_string($db, $kategorie); $sql1 = "SELECT nr, stichwort FROM STICHWOERTER WHERE stichwort = '".$_POST['stichwort']."'"; </code></pre> <p>Mir wurde dabei natürlich klar, dass mysqli_real_escape_string() nur funktionieren kann, wenn ich statt $_POST['stichwort'] $stichwort verwende... und damit handelte ich mir gleich den nächsten Error ein:</p> <p>Fehler: Incorrect integer value: '' for column <code>tagebuch_stichwoerter</code>.<code>STICHWORT_KATEGORIE</code>.<code>stichwoerter_nr</code> at row 1</p> <p>Ich glaube, ab einem bestimmten Alter sollte man das Programmieren bleiben lassen...</p> <p>Bis bald,</p> <p>Yadgar</p> Alles richtig +Beispiele Mon, 11 Oct 21 10:36:14 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792336#m1792336 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792336#m1792336 <blockquote> <p>Das ist aber wirklich nur eine diffuse Vermutung, denn bei richtiger Verwendung von mysqli_real_escape_string() sollte gerade so etwas, was du beschreibst, nicht passieren.</p> </blockquote> <p>Ein Beispiel sagt mehr als tausend Worte: (Ich hoffe, ich hab nichts falsch gemacht...)</p> <p><strong>Man hat:</strong></p> <pre><code class="block language-php"><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'search'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"Gene Roddenberry's Andromeda"</span><span class="token punctuation">;</span> <span class="token variable">$mysqli</span> <span class="token operator">=</span> <span class="token function">mysqli_connect</span><span class="token punctuation">(</span> <span class="token operator">...</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p><strong>Man will:</strong></p> <pre><code class="block language-sql"><span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> isbn<span class="token punctuation">,</span> author<span class="token punctuation">,</span> price <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> title <span class="token operator">SOUNDS LIKE</span> <span class="token string">'Gene Roddenberry\'s Andromeda'</span> </code></pre> <p><a href="https://www.php.net/manual/de/mysqli.real-escape-string.php" rel="nofollow noopener noreferrer"><strong>Man nehme also:</strong></a></p> <pre><code class="block language-php"><span class="token variable">$sql</span> <span class="token operator">=</span> <span class="token function">sprintf</span><span class="token punctuation">(</span> <span class="token string double-quoted-string">"SELECT `title`, `isbn`, `author`, `price` FROM `books` WHERE `title` SOUNDS LIKE '%s'"</span><span class="token punctuation">,</span> <span class="token variable">$mysqli</span><span class="token operator">-></span><span class="token function">real_escape_string</span><span class="token punctuation">(</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'search'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$mysqli</span><span class="token operator">-></span><span class="token function">query</span><span class="token punctuation">(</span> <span class="token variable">$sql</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$tdata</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span> <span class="token variable">$row</span> <span class="token operator">=</span> <span class="token variable">$result</span><span class="token operator">-></span><span class="token function">fetch_assoc</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$tdata</span> <span class="token operator">.=</span> <span class="token function">sprintf</span> <span class="token punctuation">(</span> <span class="token string double-quoted-string">"\t<tr><td>%s</td><td>%s</td><td>%s<td></td>€ %01.2f<td></tr>\n"</span><span class="token punctuation">,</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'title'</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'isbn'</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'author'</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">100</span> <span class="token operator">*</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'price'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p><a href="https://www.php.net/manual/de/mysqli.prepare.php" rel="nofollow noopener noreferrer"><strong>Oder</strong></a>:</p> <pre><code class="block language-php"><span class="token variable">$stmt</span> <span class="token operator">=</span> <span class="token variable">$mysqli</span><span class="token operator">-></span><span class="token function">prepare</span><span class="token punctuation">(</span> <span class="token string double-quoted-string">"SELECT `title` `isbn`, `author`, `price` FROM `books` WHERE `title` SOUNDS LIKE ?"</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$stmt</span><span class="token operator">-></span><span class="token function">bind_param</span><span class="token punctuation">(</span> <span class="token string double-quoted-string">"s"</span><span class="token punctuation">,</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'search'</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$stmt</span><span class="token operator">-></span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$stmt</span><span class="token operator">-></span><span class="token function">bind_result</span><span class="token punctuation">(</span> <span class="token variable">$title</span><span class="token punctuation">,</span> <span class="token variable">$isbn</span><span class="token punctuation">,</span> <span class="token variable">$author</span><span class="token punctuation">,</span> <span class="token variable">$price</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$tdata</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span> <span class="token variable">$stmt</span><span class="token operator">-></span><span class="token function">fetch</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$tdata</span> <span class="token operator">.=</span> <span class="token function">sprintf</span> <span class="token punctuation">(</span> <span class="token string double-quoted-string">"\t<tr><td>%s</td><td>%s</td><td>%s<td></td>€ %01.2f<td></tr>\n"</span><span class="token punctuation">,</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span> <span class="token variable">$title</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span> <span class="token variable">$isbn</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span> <span class="token variable">$author</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">100</span> <span class="token operator">*</span> <span class="token variable">$price</span><span class="token punctuation">;</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Edit Rolf B: htmlspecialchars, nicht htmlspezialchars</p> PHP: Hochkomma für MySQL/MariaDB maskieren? Mon, 11 Oct 21 10:01:40 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792335#m1792335 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792335#m1792335 <p>Hallo</p> <blockquote> <p>Der Code:</p> <pre><code class="block"> $stichwort = $_POST["stichwort"]; $stichwort = mysqli_real_escape_string($db, $stichwort); $kategorie = $_POST["kategorie"]; $kategorie = mysqli_real_escape_string($db, $kategorie); $sql1 = "SELECT nr, stichwort FROM STICHWOERTER WHERE stichwort = '".$_POST['stichwort']."'"; </code></pre> <p>Mir wurde dabei natürlich klar, dass mysqli_real_escape_string() nur funktionieren kann, wenn ich statt $_POST['stichwort'] $stichwort verwende...</p> </blockquote> <p>Dass du den unbehandelten POST-Wert statt des behandelten Werts in <code>$stichwort</code> benutzt hast, ist dir ja nun klar geworden. Mit …</p> <pre><code class="block language-php"><span class="token variable">$sql1</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"SELECT nr, stichwort FROM STICHWOERTER WHERE stichwort = '"</span><span class="token operator">.</span> <span class="token function">mysqli_real_escape_string</span><span class="token punctuation">(</span><span class="token variable">$db</span><span class="token punctuation">,</span> <span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'stichwort'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">.</span><span class="token string double-quoted-string">"'"</span><span class="token punctuation">;</span> </code></pre> <p>… wäre das nicht passiert. Das ist natürlich nur dann sinnvoll, wenn du mit <code>$stichwort</code> nicht noch andere Dinge tust, die du hier nicht zeigst.</p> <blockquote> <p>und damit handelte ich mir gleich den nächsten Error ein:</p> <p>Fehler: Incorrect integer value: '' for column <code>tagebuch_stichwoerter</code>.<code>STICHWORT_KATEGORIE</code>.<code>stichwoerter_nr</code> at row 1</p> </blockquote> <p>Das ist aber eine gänzlich andere Abfrage, oder? Und ja, ein Leerstring ist keine gültige Integer-Zahl.</p> <p>Tschö, Auge</p> <div class="signature">-- <br> 200 ist das neue 35. </div> PHP: Hochkomma für MySQL/MariaDB maskieren? Mon, 11 Oct 21 10:46:36 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792339#m1792339 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792339#m1792339 <p>Lieber Yadgar,</p> <blockquote> <pre><code class="block"> $stichwort = $_POST["stichwort"]; $stichwort = mysqli_real_escape_string($db, $stichwort); $kategorie = $_POST["kategorie"]; $kategorie = mysqli_real_escape_string($db, $kategorie); </code></pre> </blockquote> <p>das sind Beispiele aus der Hölle. Das willst Du später so nicht mehr haben. Die Variable <code>$stichwort</code> ist ein String, dem man nicht ansieht, woher sein Wert kommt und wie er für welche Zwecke behandelt worden ist. Besser so:</p> <pre><code class="block language-php"><span class="token variable">$sql</span> <span class="token operator">=</span> <span class="token string single-quoted-string">'SELECT * FROM ...'</span><span class="token punctuation">;</span> <span class="token variable">$params</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string single-quoted-string">'search'</span> <span class="token operator">=></span> <span class="token function">mysqli_escape_string</span><span class="token punctuation">(</span><span class="token variable">$_POST</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'stichwort'</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$db</span><span class="token operator">-></span><span class="token function">get</span><span class="token punctuation">(</span><span class="token variable">$sql</span><span class="token punctuation">,</span> <span class="token variable">$params</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>So sieht man, dass da ein POST-Wert konkret für DB-Anfragen vorbehandelt wird. Der Inhalt in <code>$_POST</code> ist prinzipiell nicht vertrauenswürdig, das sieht man dem Variablennamen schon an. Das sieht man einer Variable <code>$stichwort</code> nicht an. Man sieht ihr auch nicht an, dass da (vielleicht oder auch nicht) <code>mysqli_escape_string()</code> drübergefahren ist.</p> <blockquote> <p>Ich glaube, ab einem bestimmten Alter sollte man das Programmieren bleiben lassen...</p> </blockquote> <p>Man darf auch im hohen Alter noch dazu lernen. Und Dein Alter sollte so hoch nun doch noch nicht sein. ;-)</p> <p>Liebe Grüße</p> <p>Felix Riesterer</p> Workout für graue Zellen Mon, 11 Oct 21 10:48:36 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792340#m1792340 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792340#m1792340 <blockquote> <p>Ich glaube, ab einem bestimmten Alter sollte man das Programmieren bleiben lassen...</p> </blockquote> <p>Oder man sollte es öfters tun. Als Workout für die eigenen Logikbausteine. Denn Haupttodesursache für graue Zellen sind Alkohol und Langeweile. (Manche behaupten auch: „Verbeamtung“. Ich halte das aber nicht für zwingend.)</p> Alles richtig +Beispiele Mon, 11 Oct 21 11:17:57 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792345#m1792345 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792345#m1792345 <blockquote> <blockquote> <p>Das ist aber wirklich nur eine diffuse Vermutung, denn bei richtiger Verwendung von mysqli_real_escape_string() sollte gerade so etwas, was du beschreibst, nicht passieren.</p> </blockquote> <p>Ein Beispiel sagt mehr als tausend Worte: (Ich hoffe, ich hab nichts falsch gemacht...)</p> <p><strong>Man hat:</strong></p> <pre><code class="block language-php"><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'search'</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"Gene Roddenberry's Andromeda"</span><span class="token punctuation">;</span> <span class="token variable">$mysqli</span> <span class="token operator">=</span> <span class="token function">mysqli_connect</span><span class="token punctuation">(</span> <span class="token operator">...</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p><strong>Man will:</strong></p> <pre><code class="block language-sql"><span class="token keyword">SELECT</span> title<span class="token punctuation">,</span> isbn<span class="token punctuation">,</span> author<span class="token punctuation">,</span> price <span class="token keyword">FROM</span> books <span class="token keyword">WHERE</span> title <span class="token operator">SOUNDS LIKE</span> <span class="token string">'Gene Roddenberry\'s Andromeda'</span> </code></pre> <p><a href="https://www.php.net/manual/de/mysqli.real-escape-string.php" rel="nofollow noopener noreferrer"><strong>Man nehme also:</strong></a></p> <pre><code class="block language-php"><span class="token variable">$sql</span> <span class="token operator">=</span> <span class="token function">sprintf</span><span class="token punctuation">(</span> <span class="token string double-quoted-string">"SELECT `title`, `isbn`, `author`, `price` FROM `books` WHERE `title` SOUNDS LIKE '%s'"</span><span class="token punctuation">,</span> <span class="token variable">$mysqli</span><span class="token operator">-></span><span class="token function">real_escape_string</span><span class="token punctuation">(</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'search'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token variable">$mysqli</span><span class="token operator">-></span><span class="token function">query</span><span class="token punctuation">(</span> <span class="token variable">$sql</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$tdata</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span> <span class="token variable">$row</span> <span class="token operator">=</span> <span class="token variable">$result</span><span class="token operator">-></span><span class="token function">fetch_assoc</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$tdata</span> <span class="token operator">.=</span> <span class="token function">sprintf</span> <span class="token punctuation">(</span> <span class="token string double-quoted-string">"\t<tr><td>%s</td><td>%s</td><td>%s<td></td>€ %01.2f<td></tr>\n"</span><span class="token punctuation">,</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'title'</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'isbn'</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'author'</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">100</span> <span class="token operator">*</span> <span class="token variable">$row</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'price'</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p><a href="https://www.php.net/manual/de/mysqli.prepare.php" rel="nofollow noopener noreferrer"><strong>Oder</strong></a>:</p> <pre><code class="block language-php"><span class="token variable">$stmt</span> <span class="token operator">=</span> <span class="token variable">$mysqli</span><span class="token operator">-></span><span class="token function">prepare</span><span class="token punctuation">(</span> <span class="token string double-quoted-string">"SELECT `title` `isbn`, `author`, `price` FROM `books` WHERE `title` SOUNDS LIKE ?"</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$stmt</span><span class="token operator">-></span><span class="token function">bind_param</span><span class="token punctuation">(</span> <span class="token string double-quoted-string">"s"</span><span class="token punctuation">,</span> <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'search'</span><span class="token punctuation">]</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$stmt</span><span class="token operator">-></span><span class="token function">execute</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$stmt</span><span class="token operator">-></span><span class="token function">bind_result</span><span class="token punctuation">(</span> <span class="token variable">$title</span><span class="token punctuation">,</span> <span class="token variable">$isbn</span><span class="token punctuation">,</span> <span class="token variable">$author</span><span class="token punctuation">,</span> <span class="token variable">$price</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$tdata</span> <span class="token operator">=</span> <span class="token string single-quoted-string">''</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span> <span class="token variable">$stmt</span><span class="token operator">-></span><span class="token function">fetch</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$tdata</span> <span class="token operator">.=</span> <span class="token function">sprintf</span> <span class="token punctuation">(</span> <span class="token string double-quoted-string">"\t<tr><td>%s</td><td>%s</td><td>%s<td></td>€ %01.2f<td></tr>\n"</span><span class="token punctuation">,</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span> <span class="token variable">$title</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span> <span class="token variable">$isbn</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span> <span class="token variable">$author</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">100</span> <span class="token operator">*</span> <span class="token variable">$price</span><span class="token punctuation">;</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> </blockquote> <p>Verstehe ich nicht, bin ich zu dumm für!</p> <p><em>Edit Rolf B: Zitierten Tippfehler korrigiert</em></p> Alles richtig +Beispiele Mon, 11 Oct 21 13:46:31 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792368#m1792368 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792368#m1792368 <blockquote> <p>Edit Rolf B: htmlspecialchars, nicht htmlspezialchars</p> </blockquote> <p>THX!</p> PHP: Hochkomma für MySQL/MariaDB maskieren? Mon, 11 Oct 21 11:00:13 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792342#m1792342 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792342#m1792342 <blockquote> <p>Wenn Inhalte nicht nur von dir kommen, sondern auch von anderen (die sowas wie ' oder " verwenden), müssen die Zeichen natürlich dem Kontext entsprechend behandelt werden.</p> </blockquote> <p>Wenn man nicht <strong>vollständig</strong> ausschließen kann, dass der geschriebene Code in irgendeiner fernen Zukunft mit Strings gefüttert wird, die nicht vom Programmierer selbst stammen und wenn man nicht <strong>vollständig</strong> ausschließen kann, dass man selbst an einer Stelle "1000 Zeilen über der Abfrage" oder gar in einer anderen Datei dann Strings notiert, die plötzlich einer Behandlung bedürfen, sollte stets man alle Variablen in SQL-Statements „behandeln“.</p> <p><strong>Also fast immer.</strong></p> PHP: Hochkomma für MySQL/MariaDB maskieren? Mon, 11 Oct 21 11:42:58 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792353#m1792353 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792353#m1792353 <p>Hallo Felix,</p> <p>ich habe den Finger zweimal auf dem + gehabt, und zweimal auf dem -, am Ende also Neutral.</p> <p>Plus: Eine saubere Trennung von Parametrierung und DB-Zugriff ist prima.</p> <p>Plus: Du forderst Yadgar auf, sich mit Neuem zu befassen</p> <p>Minus: Du gehst nicht auf die Umsetzung ein. Dein SQL Statement macht an der entscheidenden Stelle ein ... - wie wird params["search"] ins SQL eingebaut?</p> <p>Minus: Du schlägst eine get-Methode vor, die es weder in MYSQLi noch in PDO gibt. Oder sie in in php.net nicht dokumentiert.</p> <p>Dein Einwand, dass $stichwort eine mehrdeutige Semantik hat, ist je nach Kontext richtig oder falsch. In einer Riesenfunktion, die alles mögliche tut, hast Du recht. In einer Funktion, die genau diese Abfrage durchführt und weiter nichts, kann man das machen.</p> <hr> <p>mysqli hat eine query-Methode, um SQL direkt auszuführen. Dann muss man aber die variablen Teile direkt ins SQL einsetzen und natürlich auch von Hand maskieren. Gleiches gilt für die query-Methode in PDO.</p> <p>Eine eigengeschriebene get-Methode auf einem Objekt, dass mysqli kapselt oder davon abgeleitet ist, ist machbar. Sie müsste dann die benannten Parameter ins SQL Statement einsetzen. Das SQL muss dafür benannte Parametermarker enthalten.</p> <p>Dann sollte man das aber nicht so machen, dass der Aufrufer die Maskierung durchführt. Statt dessen sollte die $param-Struktur den unmaskierten Wert und einen Wertetyp enthalten, und die get-Methode kümmert sich um Maskierung und das Einsetzen der Werte.</p> <p>Es ist aber wenig sinnvoll, sowas selbst zu bauen. Dafür gibt's PDO, da ist das alles schon fertig vorhanden, wenn man prepared statements nutzt (die natürlich den Nachteil eines doppelten DB-Roundtrip haben). Allerdings wird auch da zwischen prepare und execute getrennt. Benannte Parameter in einem Rutsch in benannte SQL Platzhalter einzusetzen geht auch da nicht.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> PHP: Hochkomma für MySQL/MariaDB maskieren? Mon, 11 Oct 21 11:37:03 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792350#m1792350 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792350#m1792350 <p>@@An die Zukunft denken ...</p> <blockquote> <p><strong>Also fast immer.</strong></p> </blockquote> <p>Nicht fast, sondern immer. </p> <p>Der Kontextwechsel ist immer zu beachten. Zeichen, die in einem bestimmten Kontext eine Sonderfunktion haben, sind immer diesem Kontext entsprechend zu behandeln.</p> <p>Meine Formulierung war da nicht korrekt.</p> <p>Dass im Text weder ' noch " vorkommen sollte, hat natürlich nicht den Grund, sich die kontextgerechte Behandlung dieser Zeichen zu sparen.</p> <p> LLAP</p> <div class="signature">-- <br> <em>„Dann ist ja auch schrecklich, dass wir in einem Land leben, in dem nicht nur Bildungswillige leben, sondern auch hinreichende Zahlen von Bekloppten. Das darf ich so locker formulieren, ich bin ja jetzt Rentner und muss nicht mehr auf jedes Wort achten.“</em><br> — Joachim Gauck über Impfgegner </div> Humor... Mon, 11 Oct 21 11:25:23 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792346#m1792346 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792346#m1792346 <blockquote> <p>Verstehe ich nicht, bin ich zu dumm für!</p> </blockquote> <p>Und welche Ausrede hast Du dafür, das nicht als Humor zu „taggen“?</p> Humor... Mon, 11 Oct 21 11:43:09 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792354#m1792354 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792354#m1792354 <p>Hi(gh)!</p> <blockquote> <blockquote> <p>Verstehe ich nicht, bin ich zu dumm für!</p> </blockquote> <p>Und welche Ausrede hast Du dafür, das nicht als Humor zu „taggen“?</p> </blockquote> <p>Ich habe halt wirklich kaum Ahnung vom Programmieren, weil ich es viel zu selten tue und einfach nicht dran bleibe... der größte Teil meiner Zeit geht für Schlafen, Essen, Kacken, Zocken (Satisfactory, Valheim) und konfus im Netz rumsurfen drauf, ich schaffe es ja nicht einmal, mein Zimmer (für eine richtige Wohnung hat es auch nie gereicht) in Ordnung zu halten...</p> <p>Aber es muss auch Loser geben, da sich andernfalls die Winner nicht allzuviel auf ihr Supererfolgsleben einbilden könnten...</p> <p>Und auf den ganzen Programmier-Trip bin ich ja nur gekommen, weil ich EIGENTLICH gar kein Computerfreak werden, sondern als langhaariger bärtiger Aussteiger mit dem Fahrrad nach Afghanistan fahren wollte (und dann weiter nach Indien, mit allem, was zu so einem Hippie-Ausflipp dazugehört)... Afghanistan ist aber leider seit über 40 Jahren unbereisbar und wird auch unbereisbar bleiben, also muss ich mir mein eigenes Afghanistan hier in meinem Wohnklo schaffen - das geht nur mittels Computer, was wiederum Programmieren erfordert.</p> <p>Zu langen Haaren und Bart hat es gereicht, ansonsten habe ich allerdings seit meinem Abitur (1989) nichts mehr auf die Reihe bekommen...</p> <p>Bis bald im Khyberspace!</p> <p>Yadgar</p> PHP: Hochkomma für MySQL/MariaDB maskieren? Mon, 11 Oct 21 11:35:14 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792349#m1792349 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792349#m1792349 <p>Hi,</p> <blockquote> <p>Ich habe es jetzt mit htmlspecialchars() probiert...</p> </blockquote> <p>htmlspecialchars gehört da nicht hin, Du erzeugst ja grade nicht eine HTML-Ausgabe, sondern eine Datenbank-Query.</p> <blockquote> <p>aber htmlspecialchars("Gene Roddenberry's Andromeda") ergibt nach wie vor "Gene Roddenberry's Andromeda" (und damit weiterhin den MySQL-Error)</p> </blockquote> <p>Klar, ' ist kein Html-Special-Char.</p> <blockquote> <p>und nicht etwa "Gene Roddenberry&#039;s Andromeda", wie es laut https://www.php.net/manual/de/function.htmlspecialchars.php sein müsste</p> </blockquote> <p>aber nur wenn ENT_QUOTES gesetzt ist</p> <p>Nachzulesen unter Deinem Link.</p> <blockquote> <p>(und wie auch in phpmymyadmin der entsprechende Eintrag in der Tabelle STICHWOERTER angezeigt wird)!</p> </blockquote> <p>Oh, dann ist schon beim Import der Daten in die Datenbank was schiefgelaufen - was soll eine HTML-Maskierung in der Datenbank?</p> <p>cu,<br> Andreas a/k/a MudGuard</p> PHP: Hochkomma für MySQL/MariaDB maskieren? Mon, 11 Oct 21 11:42:56 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792352#m1792352 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792352#m1792352 <p>wenn, dann wohl etwas wie:</p> <pre><code class="block language-php"><span class="token variable">$string</span> <span class="token operator">=</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'Gene Roddenberry\'s Andromeda'</span><span class="token punctuation">,</span> <span class="token class-name">ENT_QUOTES</span> <span class="token operator">|</span> <span class="token class-name">ENT_HTML5</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'UTF-8'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$string</span> <span class="token operator">.</span> <span class="token constant">PHP_EOL</span><span class="token punctuation">;</span> </code></pre> <pre><code class="block">Gene Roddenberry&apos;s Andromeda </code></pre> <p>Aber das löst Dein Problem nicht; Du willst das der Datenbank übergeben und nicht im HTML-Kontext ausgeben.</p> PHP: Hochkomma für MySQL/MariaDB maskieren? Mon, 11 Oct 21 13:11:00 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792362#m1792362 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792362#m1792362 <p>Hallo Yadgar, hallo Raketen.*,</p> <p>bis PHP 8.0 ist der Defaultwert für den flags-Parameter von htmlspecialchars ENT_COMPAT, d.h. einfache Anführungszeichen werden nicht umgesetzt. <strong>Das ändert sich</strong> mit PHP 8.1, da wechselt der Default auf ENT_QUOTES|ENT_SUBSTITUTE, ein breaking change, der meines Erachtens etliche Webseiten abschießen könnte. Immerhin ist es <a href="https://www.php.net/manual/de/migration81.incompatible.php#migration81.incompatible.standard" rel="nofollow noopener noreferrer">hier</a> aufgeschrieben.</p> <p>Deswegen sollte man die Funktion definitiv nicht ohne Flags aufrufen, sondern</p> <p><code>htmlspecialchars($data, ENT_QUOTES | ENT_HTML5)</code></p> <p>verwenden. Dann entsteht aus dem Hochkomma &apos; und nicht das nichtssagende &#039;. Man könnte auch noch das in PHP 8.1 hinzu kommende ENT_SUBSTITUTE hinzufügen.</p> <p>Für Yadgar ist aber auch wichtig, dass die htmlspecialchars-Maskierung <strong>nicht</strong> vor dem Schreiben in die DB erfolgen darf. In die Datenbank gehört das ' (besser natürlich das typographisch richtige Zeichen ’, das aber nur ausgewählte Benutzer überhaupt eingeben können) und keine HTML-Codierung dieses Zeichens. Die HTML Codierung gehört ausschließlich vor die HTML Ausgabe und nirgendwo anders hin.</p> <p>Und um Probleme mit der Schreibweise auszuschließen, muss man dafür sorgen, dass Interpunktion möglichst von Suchvorgängen ausgenommen wird. Ob der <code>SOUNDS LIKE</code> Operator dafür genügt, weiß ich nicht.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> PHP: Hochkomma für MySQL/MariaDB maskieren? Mon, 11 Oct 21 11:51:17 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792357#m1792357 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792357#m1792357 <p>Hi(gh)!</p> <blockquote> <p>htmlspecialchars gehört da nicht hin, Du erzeugst ja grade nicht eine HTML-Ausgabe, sondern eine Datenbank-Query.</p> </blockquote> <p>Wenn in der Datenbank selbst der Eintrag auch schon entsprechend maskiert wurde, gehört es da schon hin!</p> <blockquote> <p>aber nur wenn ENT_QUOTES gesetzt ist</p> <p>Nachzulesen unter Deinem Link.</p> </blockquote> <p>Habe ich gemacht, jetzt funktioniert es... danke für den Hinweis!</p> <blockquote> <p>Oh, dann ist schon beim Import der Daten in die Datenbank was schiefgelaufen - was soll eine HTML-Maskierung in der Datenbank?</p> </blockquote> <p>Die Daten wurden nicht importiert, sondern von Hand eingegeben (und zwar nicht via phpmyadmin, sondern mittels eines ebenfalls selbst programmierten PHP-Skripts!)…</p> <p>Bis bald im Khyberspace!</p> <p>Yadgar</p> PHP: Hochkomma für MySQL/MariaDB maskieren? Mon, 11 Oct 21 11:46:49 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792356#m1792356 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792356#m1792356 <p>Ach so. In der Datenbank steht schon "Mist".</p> <pre><code class="block language-php"><span class="token variable">$string</span> <span class="token operator">=</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span> <span class="token string single-quoted-string">'Gene Roddenberry\'s Andromeda'</span><span class="token punctuation">,</span> <span class="token class-name">ENT_QUOTES</span> <span class="token operator">|</span> <span class="token class-name">ENT_HTML401</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'UTF-8'</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$string</span> <span class="token operator">.</span> <span class="token constant">PHP_EOL</span><span class="token punctuation">;</span> </code></pre> <pre><code class="block">Gene Roddenberry&#039;s Andromeda </code></pre> Humor... Mon, 11 Oct 21 12:05:03 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792359#m1792359 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792359#m1792359 <blockquote> <blockquote> <blockquote> <p>Verstehe ich nicht, bin ich zu dumm für!</p> </blockquote> <p>Und welche Ausrede hast Du dafür, das nicht als Humor zu „taggen“?</p> </blockquote> </blockquote> <blockquote> <p>Zu langen Haaren und Bart hat es gereicht, ansonsten habe ich allerdings seit meinem Abitur (1989) nichts mehr auf die Reihe bekommen...</p> </blockquote> <p>Ersetze einfach das <em>„ich zu dumm für“</em> durch <em>„muss mich halt mehr anstrengen als die Überflieger“</em>.</p> <p>Ich habe mein Abitur 1985 gemacht - mit 3 Jahren Verspätung weil die „Kommunisten“ meinten, dass ich dazu erst mal der Arbeiterklasse(*) angehören muss. Also bist Du deutlich jünger als ich: Dann mach's wie ich: Streng Dich mal brav an.</p> <p>*) dazu gehörte man z.B. mit einem Facharbeiterbrief und einjähriger Tätigkeit als „Maschinen- und Anlagenmonteur“ oder mit den richtigen Vorfahren als Mitglied der <a href="https://de.wikipedia.org/wiki/Nomenklatura#Deutsche_Demokratische_Republik" rel="nofollow noopener noreferrer">Nomenklatur</a>.</p> PHP: Hochkomma für MySQL/MariaDB maskieren? Mon, 11 Oct 21 13:10:56 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792361#m1792361 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792361#m1792361 <p>Hallo</p> <blockquote> <p>Hi(gh)!</p> <blockquote> <p>htmlspecialchars gehört da nicht hin, Du erzeugst ja grade nicht eine HTML-Ausgabe, sondern eine Datenbank-Query.</p> </blockquote> <p>Wenn in der Datenbank selbst der Eintrag auch schon entsprechend maskiert wurde, gehört es da schon hin!</p> </blockquote> <p>Es gehört dort definitiv <em>nicht</em> hin. Eine Maskierung für den HTML-Kontext gehört in den HTML-Kontext und nicht in die Datenbank. Was ist, wenn du mit den Inhalten aus der Datenbank einstmals ein PDF erzeugen willst? Prökelst du dir dann die Maskierungen wieder heraus?</p> <blockquote> <blockquote> <p>Oh, dann ist schon beim Import der Daten in die Datenbank was schiefgelaufen - was soll eine HTML-Maskierung in der Datenbank?</p> </blockquote> <p>Die Daten wurden nicht importiert, sondern von Hand eingegeben (und zwar nicht via phpmyadmin, sondern mittels eines ebenfalls selbst programmierten PHP-Skripts!)…</p> </blockquote> <p>… und genau dabei es ist <em>doch</em> schiefgelaufen.</p> <p>Tschö, Auge</p> <div class="signature">-- <br> 200 ist das neue 35. </div> PHP: Hochkomma für MySQL/MariaDB maskieren? Mon, 11 Oct 21 13:42:49 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792367#m1792367 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792367#m1792367 <blockquote> <p>Es gehört dort definitiv nicht hin. Eine Maskierung für den HTML-Kontext gehört in den HTML-Kontext und nicht in die Datenbank.</p> </blockquote> <p>Jepp! In die Datenbank gehören Rohdaten. Daran Herumfummeln kann man bei Abfragen oder - nur wenn nötig - mit <em>zusätzlichen</em>, speziell erzeugten und indizierten Suchspalten.</p> MySQL SOUNDS LIKE Mon, 11 Oct 21 13:33:31 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792365#m1792365 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792365#m1792365 <p>Eigentlich war das nur ein Syntaxbeispiel… Aber wenn wir schon dabei sind.</p> <pre><code class="block language-sql">MariaDB <span class="token punctuation">[</span><span class="token punctuation">(</span>none<span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token operator">></span> <span class="token keyword">select</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token string">'Gene Roddenberry\'s Andromeda'</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token operator">sounds like</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token string">'Gene Roddenberrys Andromeda'</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token string">'Ja'</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token string">'Nein'</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token punctuation">)</span> <span class="token keyword">as</span> Antwort<span class="token punctuation">;</span> <span class="token operator">+</span><span class="token comment">---------+</span> <span class="token operator">|</span> Antwort <span class="token operator">|</span> <span class="token operator">+</span><span class="token comment">---------+</span> <span class="token operator">|</span> Ja <span class="token operator">|</span> <span class="token operator">+</span><span class="token comment">---------+</span> <span class="token number">1</span> <span class="token keyword">row</span> <span class="token operator">in</span> <span class="token keyword">set</span> <span class="token punctuation">(</span><span class="token number">0.000</span> sec<span class="token punctuation">)</span> </code></pre> <ul> <li>Dito mit '&#039;s' statt '''.</li> <li>Nein mit '&apos;' statt '''.</li> <li>„visa versa“ mit jeweilig gleichem Ergebnis.</li> </ul> PHP: Hochkomma für MySQL/MariaDB maskieren? Mon, 11 Oct 21 16:38:12 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792376#m1792376 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792376#m1792376 <p>@@Rolf B</p> <blockquote> <p>(besser natürlich das typographisch richtige Zeichen ’, das aber nur ausgewählte Benutzer überhaupt eingeben können)</p> </blockquote> <p>Bei „smarten“ Systemen sind alle Nutzer auserwählt: ' wird automatisch in ’ (bzw. ‚ (kein Komma!) oder ‘) umgewandelt; " in „/“/”.<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup></p> <blockquote> <p>Die HTML Codierung gehört ausschließlich vor die HTML Ausgabe und nirgendwo anders hin.</p> </blockquote> <p>Gehört sie? <code>"</code> und <code>'</code> müssen in HTML als Elementinhalt nicht escapet werden, sondern nur in Attributwerten, wo das jeweilige Zeichen als Begrenzungszeichen verwendet wird.</p> <p>korrekt: <code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>p</span><span class="token punctuation">></span></span>Deppenapostroph's<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>p</span><span class="token punctuation">></span></span></code></p> <p>korrekt: <code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>img</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>…<span class="token punctuation">"</span></span> <span class="token attr-name">alt</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Deppenapostroph's<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span></code></p> <p>hier muss escapet werden: <code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>img</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>…<span class="token punctuation">"</span></span> <span class="token attr-name">alt</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">'</span>Deppenapostroph<span class="token entity named-entity" title="'">&apos;</span>s<span class="token punctuation">'</span></span><span class="token punctuation">/></span></span></code></p> <p>hier auch: <code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>img</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>…<span class="token punctuation">"</span></span> <span class="token attr-name">alt</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span>Deppenapostroph<span class="token entity named-entity" title="'">&apos;</span>s/</span><span class="token punctuation">></span></span></code></p> <p> LLAP</p> <div class="signature">-- <br> <em>„Dann ist ja auch schrecklich, dass wir in einem Land leben, in dem nicht nur Bildungswillige leben, sondern auch hinreichende Zahlen von Bekloppten. Das darf ich so locker formulieren, ich bin ja jetzt Rentner und muss nicht mehr auf jedes Wort achten.“</em><br> — Joachim Gauck über Impfgegner </div> <hr class="footnotes-sep"> <section class="footnotes"> <ol class="footnotes-list"> <li id="fn1" class="footnote-item"><p>Die Automatik ist nicht immer smart. Besonders nicht, wenn sie smarter als der Nutzer sein will. Slack macht mir aus eingebenen <code>„x“</code> <em>„x”</em> und lässt mich so aussehen als könnte ich nicht richtig schreiben. (Im Polnischen und Niederländischen wäre ” als schließendes Anführungszeichen richtig; im Deutschen aber nicht.) <a href="#fnref1" class="footnote-backref">↩︎</a></p> </li> </ol> </section> PHP: Hochkomma für MySQL/MariaDB maskieren? Mon, 11 Oct 21 19:14:38 Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792379#m1792379 https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792379#m1792379 <p>Hallo Gunnar,</p> <blockquote> <p>" und ' müssen in HTML als Elementinhalt nicht escapet werden, sondern nur in Attributwerten</p> </blockquote> <p>Ja gut, kontextgerechte Behandlung bedeutet auch, den jeweiligen Kontext korrekt zu identifizieren und die entsprechende Maskierung durchzuführen</p> <pre><code class="block bad language-php"><span class="token variable">$snip</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"<img src='<span class="token interpolation"><span class="token variable">$imgsrc</span></span>' alt='A foo's folly'>"</span><span class="token punctuation">;</span> </code></pre> <p>da merkt man schon beim Schreiben, dass da was falsch ist und würde von Hand ein &apos; einsetzen müssen (und $imgsrc wurde hoffentlich anderweit vorbehandelt). Bei</p> <pre><code class="block bad language-php"><span class="token variable">$snip</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"<img src='<span class="token interpolation"><span class="token variable">$img</span><span class="token operator">-></span><span class="token property">url</span></span>' alt='<span class="token interpolation"><span class="token variable">$img</span><span class="token operator">-></span><span class="token property">altText</span></span>'>"</span><span class="token punctuation">;</span> </code></pre> <p>fällt das nicht auf, aber da muss man dann eben drauf achten, korrekt zu maskieren:</p> <pre><code class="block good language-php"><span class="token variable">$snip</span> <span class="token operator">=</span> <span class="token function">sprintf</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"<img src='%s' alt='%s'>"</span><span class="token punctuation">,</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span><span class="token variable">$img</span><span class="token operator">-></span><span class="token property">url</span><span class="token punctuation">,</span> <span class="token class-name">ENT_QUOTES</span> <span class="token operator">|</span> <span class="token class-name">ENT_HTML5</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">htmlspecialchars</span><span class="token punctuation">(</span><span class="token variable">$img</span><span class="token operator">-></span><span class="token property">altText</span><span class="token punctuation">,</span> <span class="token class-name">ENT_QUOTES</span> <span class="token operator">|</span> <span class="token class-name">ENT_HTML5</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>ist dann angesagt.</p> <p>Das ist der Vorteil von UI Frameworks wie ASP.NET, die kümmern sich da automagisch drum. Dafür haben sie genügend anderen Unfug im Kopf.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div>