tag:forum.selfhtml.org,2005:/self PHP: Hochkomma für MySQL/MariaDB maskieren? – SELFHTML-Forum 2021-10-11T19:14:38Z https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792329#m1792329 Yadgar yazdegird@gmx.de 2021-10-11T09:25:23Z 2021-10-11T09:25:23Z PHP: Hochkomma für MySQL/MariaDB maskieren? <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792332#m1792332 Der Martin 2021-10-11T09:37:21Z 2021-10-11T09:37:21Z PHP: Hochkomma für MySQL/MariaDB maskieren? <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792338#m1792338 Gunnar Bittersmann selfhtml@bittersmann.de https://bittersmann.de 2021-10-11T10:45:03Z 2021-10-11T10:45:03Z PHP: Hochkomma für MySQL/MariaDB maskieren? <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792348#m1792348 Yadgar yazdegird@gmx.de 2021-10-11T11:30:50Z 2021-10-11T11:30:50Z PHP: Hochkomma für MySQL/MariaDB maskieren? <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792334#m1792334 Yadgar yazdegird@gmx.de 2021-10-11T09:55:11Z 2021-10-11T09:55:11Z PHP: Hochkomma für MySQL/MariaDB maskieren? <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792336#m1792336 Raketenbeispielgeber 2021-10-11T10:36:14Z 2021-10-11T11:47:20Z Alles richtig +Beispiele <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792335#m1792335 Auge 2021-10-11T10:01:40Z 2021-10-11T10:03:26Z PHP: Hochkomma für MySQL/MariaDB maskieren? <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792339#m1792339 Felix Riesterer https://felix-riesterer.de 2021-10-11T10:46:36Z 2021-10-11T10:46:36Z PHP: Hochkomma für MySQL/MariaDB maskieren? <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792340#m1792340 Raketenwilli 2021-10-11T10:48:36Z 2021-10-11T10:48:36Z Workout für graue Zellen <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792345#m1792345 Yadgar yazdegird@gmx.de 2021-10-11T11:17:57Z 2021-10-11T11:48:14Z Alles richtig +Beispiele <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792368#m1792368 Raketendanksager 2021-10-11T13:46:31Z 2021-10-11T13:46:31Z Alles richtig +Beispiele <blockquote> <p>Edit Rolf B: htmlspecialchars, nicht htmlspezialchars</p> </blockquote> <p>THX!</p> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792342#m1792342 An die Zukunft denken ... 2021-10-11T11:00:13Z 2021-10-11T11:00:13Z PHP: Hochkomma für MySQL/MariaDB maskieren? <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792353#m1792353 Rolf B 2021-10-11T11:42:58Z 2021-10-11T11:42:58Z PHP: Hochkomma für MySQL/MariaDB maskieren? <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792350#m1792350 Gunnar Bittersmann selfhtml@bittersmann.de https://bittersmann.de 2021-10-11T11:37:03Z 2021-10-11T11:37:03Z PHP: Hochkomma für MySQL/MariaDB maskieren? <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792346#m1792346 Raketenwilli 2021-10-11T11:25:23Z 2021-10-11T11:25:23Z Humor... <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792354#m1792354 Yadgar yazdegird@gmx.de 2021-10-11T11:43:09Z 2021-10-11T11:43:09Z Humor... <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792349#m1792349 MudGuard http://www.andreas-waechter.de/ 2021-10-11T11:35:14Z 2021-10-11T11:35:14Z PHP: Hochkomma für MySQL/MariaDB maskieren? <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792352#m1792352 Raketenbeispielgeber 2021-10-11T11:42:56Z 2021-10-11T11:42:56Z PHP: Hochkomma für MySQL/MariaDB maskieren? <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792362#m1792362 Rolf B 2021-10-11T13:11:00Z 2021-10-11T13:11:00Z PHP: Hochkomma für MySQL/MariaDB maskieren? <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792357#m1792357 Yadgar yazdegird@gmx.de 2021-10-11T11:51:17Z 2021-10-11T11:51:17Z PHP: Hochkomma für MySQL/MariaDB maskieren? <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792356#m1792356 Raketenbeispielgeber 2021-10-11T11:46:49Z 2021-10-11T11:46:49Z PHP: Hochkomma für MySQL/MariaDB maskieren? <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792359#m1792359 Raketenwilli 2021-10-11T12:05:03Z 2021-10-11T12:05:03Z Humor... <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792361#m1792361 Auge 2021-10-11T13:10:56Z 2021-10-11T13:10:56Z PHP: Hochkomma für MySQL/MariaDB maskieren? <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792367#m1792367 Raketenzustimmungsbeauftragter 2021-10-11T13:42:49Z 2021-10-11T13:42:49Z PHP: Hochkomma für MySQL/MariaDB maskieren? <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792365#m1792365 Raktentestpilot 2021-10-11T13:33:31Z 2021-10-11T13:33:31Z MySQL SOUNDS LIKE <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792376#m1792376 Gunnar Bittersmann selfhtml@bittersmann.de https://bittersmann.de 2021-10-11T16:38:12Z 2021-10-11T16:38:12Z PHP: Hochkomma für MySQL/MariaDB maskieren? <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> https://forum.selfhtml.org/self/2021/oct/11/php-hochkomma-fur-mysql-mariadb-maskieren/1792379#m1792379 Rolf B 2021-10-11T19:14:38Z 2021-10-11T19:14:38Z PHP: Hochkomma für MySQL/MariaDB maskieren? <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>