是否有内置函数来转义Oracle查询的字符串? (比如MySQL的mysql_real_escape_string)

时间:2018-05-18 07:29:28

标签: php sql oracle

据我所知,现在处理所有SQL查询的正确方法应该是使用PDO(或使用PHP框架中提供的功能,如laravel中的eloquent)但是,因为MySQL有mysql_real_escape_string,所以我是好奇如果在PHP中有类似Oracle的功能吗?

我在Google上搜索过,大多数答案似乎是自己编写一个字符串替换代码。这至少在一些常见的问题上起作用,比如引用('),但我很好奇是否有内置函数。 (以防万一需要进行其他转义以防止SQL注入)

2 个答案:

答案 0 :(得分:1)

要回答关于SQL注入的真正问题,你应该(实际上是'必须')使用绑定变量而不是字符串连接,如Álvaro González所述。这对性能和可伸缩性也很重要。绑定使数据与SQL分离,并避免严格需要清理数据。举个例子我说的是:

<?php

$conn = oci_connect('hr', 'welcome', 'localhost/orclpdb');

$query = "select first_name, last_name
          from employees
          order by
              case :ob
                   when 'FIRST_NAME' then first_name
                   else last_name
              end";

$vs = "FIRST_NAME";

$s = oci_parse($conn, $query);
oci_bind_by_name($s, ":ob", $vs);
$r = oci_execute($s);

echo "<table border='1'>\n";
while (($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
    echo "<tr>\n";
    foreach ($row as $item) {
        echo "  <td>".($item !== null ? htmlentities($item, ENT_QUOTES):"&nbsp;")."</td>\n";
    }
    echo "</tr>\n";
}

答案 1 :(得分:0)

有一个包DBMS_ASSERT。它专门用于准备和验证输入字符串。 DBMS_ASSERT
ENQUOTE_LITERAL功能

如果想要核心字符串文字,可以使用退出机制 q'( ... )'
q'~ ... ~'
q'! ... !'

DECLARE
       v VARCHAR2(1024);
    BEGIN
       v := q'( The string  with quouts ',','   )';
       DBMS_OUTPUT.PUT_LINE(v);
    END;