据我所知,现在处理所有SQL查询的正确方法应该是使用PDO(或使用PHP框架中提供的功能,如laravel中的eloquent)但是,因为MySQL有mysql_real_escape_string
,所以我是好奇如果在PHP中有类似Oracle的功能吗?
我在Google上搜索过,大多数答案似乎是自己编写一个字符串替换代码。这至少在一些常见的问题上起作用,比如引用('
),但我很好奇是否有内置函数。 (以防万一需要进行其他转义以防止SQL注入)
答案 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):" ")."</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;